library(parallel)
library(optimx)
library(GGally)
Registered S3 method overwritten by 'GGally':
  method from   
  +.gg   ggplot2
citation(package = "optimx")

To cite optimx in publications use:

  John C. Nash, Ravi Varadhan (2011). Unifying Optimization Algorithms to Aid Software
  System Users: optimx for R. Journal of Statistical Software, 43(9), 1-14. doi
  10.18637/jss.v043.i09.

  John C. Nash (2014). On Best Practice Optimization Methods in R. Journal of Statistical
  Software, 60(2), 1-14. doi 10.18637/jss.v060.i02.

To see these entries in BibTeX format, use 'print(<citation>, bibtex=TRUE)', 'toBibtex(.)',
or set 'options(citation.bibtex.max=999)'.
list.of.cells <- read_csv("~/plots/all_data/all_exp_data.csv") %>% split(.$cell.id)
Rows: 535515 Columns: 8
── Column specification ────────────────────────────────────────────────────────────────────────────────────────────────
Delimiter: ","
chr (5): cell.id, exp.field, degron, red, treatment
dbl (3): delta.time, gfpMeanBgAFsub, image.no

ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
#for non treated (no DMSO cells)cells all the three GFPs
bind_rows(list.of.cells) %>% 
  filter( treatment == "none", red == "pup1-rfp") %>% 
  group_by(cell.id) %>% 
  mutate(It_I0 = gfpMeanBgAFsub/gfpMeanBgAFsub[1]) %>% 
  ggplot(.,aes(x = delta.time/60, y = gfpMeanBgAFsub , group_by = cell.id ))+
  geom_line(alpha = 0.2)+
  geom_hline(yintercept = 0.5)+
  facet_wrap(~degron, scales = "free")+
  theme_pubr()


bind_rows(list.of.cells) %>% 
  filter( treatment != "none", red == "pup1-rfp") %>% 
  group_by(cell.id) %>% 
  mutate(It_I0 = gfpMeanBgAFsub/gfpMeanBgAFsub[1]) %>% 
  ggplot(.,aes(x = delta.time/60, y = gfpMeanBgAFsub , group_by = cell.id ))+
  geom_line(alpha = 0.2)+
  geom_hline(yintercept = 0.5)+
  facet_wrap(~treatment, scales = "free")+
  theme_pubr()

#profiles

#CLN2
bind_rows(list.of.cells) %>% 
  filter(degron %in% c("cln2","cln2.2","cln2.3"), treatment == "none", delta.time == 0) %>% 
  ggplot(.,aes(x = gfpMeanBgAFsub, fill = degron))+
  geom_density(aes(y = ..scaled..), alpha = 0.2)+
  facet_wrap(~red, scales = "free_x")+
  scale_x_log10()+
  theme_pubr()


#mODC
bind_rows(list.of.cells) %>% 
  filter(degron %in% c("mODC","mODC.2","mODC.3"), treatment == "none", delta.time == 0) %>% 
   ggplot(.,aes(x = gfpMeanBgAFsub, fill = degron))+
  geom_density(aes(y = ..scaled..), alpha = 0.2)+
  facet_wrap(~red, scales = "free_x")+
  scale_x_log10()+
  theme_pubr()

bind_rows(list.of.cells) %>% 
  filter(image.no == 1) %>% 
  group_by(treatment, red, degron) %>% tally()

mechanistic models with maturation, decay and f

#with 3 parameters (rate of decay, rate of maturation, frac of translation after CHX treatment)
 mechanistic.fn<- function(par, df){
   f <- par[1]
   dy <- par[2]
   dm <- par[3]

   df.new <- df  %>%
     mutate(model = ((dy * (1 - f) * exp(-dy * delta.time)) / dm) + exp(-dy * delta.time) +
              (1 - exp(-dy * delta.time)) * f -
              ((dy * (1 - f) * exp(-(dy + dm) * delta.time)) / dm)) %>%
     mutate(error = (I0_It - model) ^ 2) %>%
     summarise(sum.error = sum(error))
    
    return(df.new$sum.error)
  }

#two parameter model (rate of decay, frac of translation after CHX treatment)
 mechanistic.fn.nodm<- function(par, df){
   f <- par[1]
   dy <- par[2]

   df.new <- df  %>%
     mutate(model = exp(-dy * delta.time) +(1 - exp(-dy * delta.time)) * f ) %>%
     mutate(error = (I0_It - model) ^ 2) %>%
     summarise(sum.error = sum(error))
    
    return(df.new$sum.error)
 }
 
#one parameter model (rate of decay, exponential model)
  mechanistic.fn.exp<- function(par, df){
   
   dy <- par[1]

   df.new <- df  %>%
     mutate(model = exp(-dy * delta.time)) %>%
     mutate(error = (I0_It - model) ^ 2) %>%
     summarise(sum.error = sum(error))
    
    return(df.new$sum.error)
  }
  
#two parameter model (rate of maturation and rate of decay)
    mechanistic.fn.wof<- function(par, df){
  
   dy <- par[1]
   dm <- par[2]

   df.new <- df  %>%
     mutate(model = ((dy  * exp(-dy * delta.time)) / dm) + exp(-dy * delta.time)  -
              ((dy * 1 * exp(-(dy + dm) * delta.time)) / dm)) %>%
     mutate(error = (I0_It - model) ^ 2) %>%
     summarise(sum.error = sum(error))
    
    return(df.new$sum.error)
  }

(dy(1-frac)EXP(-dyA1)/dm + EXP(-dyA1) + (1-EXP(-dyA1))frac - dy(1-frac)EXP(-(dy+dm)*A1)/dm)

log(2)/6#for sfGFP in yeast growth conditions 
[1] 0.1155245
#degron GFPS
list.of.cells.1 <- bind_rows(list.of.cells) %>% #to analyze the new experiments from 7-20-22 and 8-4-22
  filter(degron %in% c("mODC.3","cln2.3")) %>% 
  split(.$cell.id)

#only stable and 50uM treatment cells
list.of.cells.2 <- bind_rows(list.of.cells) %>% #to analyze the stable pup1-rfp from 7-20-22
  filter(degron %in% c("stable", "stable.2") |
         treatment == "50uM") %>% 
  split(.$cell.id)

10-18-22

#degron GFPS
list.of.cells.1 <- bind_rows(list.of.cells) %>% #to analyze the new experiments from 7-20-22 and 8-4-22
  filter(degron == "cln2.4") %>% 
  split(.$cell.id)

#only stable and 50uM treatment cells
list.of.cells.2 <- bind_rows(list.of.cells) %>% #to analyze the stable pup1-rfp from 7-20-22
  filter(degron == "stable.3") %>% 
  split(.$cell.id)

#estimating parameters dy, dm , f

#for the degron GFP

single.cell.dy.f.dm.1 <- mclapply(list.of.cells.1, function(a){ 
   
   par.optim <- c(0.5, 0.05005, 0.1)
   
   names(par.optim) <- c("f", "dy", "dm")
   
   df <- a %>% 
            mutate(image.no = image.no-1) %>% 
            group_by(cell.id) %>% 
            mutate(I0_It = gfpMeanBgAFsub/gfpMeanBgAFsub[1],
                   delta.time = delta.time/60) %>% 
     ungroup()
   
   optimx(par = par.optim, 
          fn = mechanistic.fn , 
          method = "L-BFGS-B", 
          lower = c(0, 0.005, 0.00001), # dy = 0.00001*60 for stable GFP
          upper = c(1, 1, Inf), #changed from dy = 6 to dy = 10 and now to dy = 1
          df = df,
          itnmax = 100000)
   }, mc.cores = 40)
#for the stable GFP and the 50uM treatment
#for the repeate of 10-7-22 
single.cell.dy.f.dm.2 <- mclapply(list.of.cells.2, function(a){ 
   
   par.optim <- c(0.5, 0.005005, 0.1)
   
   names(par.optim) <- c("f", "dy", "dm")
   
   df <- a %>% 
            mutate(image.no = image.no-1) %>% 
            group_by(cell.id) %>% 
            mutate(I0_It = gfpMeanBgAFsub/gfpMeanBgAFsub[1],
                   delta.time = delta.time/60) %>% 
     ungroup()
   
   optimx(par = par.optim, 
          fn = mechanistic.fn , 
          method = "L-BFGS-B", 
          lower = c(0, 0.0005, 0.00001), # dy = 0.00001*60 for stable GFP
          upper = c(1, 0.1, Inf), #change dy = 0.1 from 10, similarly for all the other optimizations 
          df = df,
          itnmax = 100000)
   }, mc.cores = 40)
single.cell.dy.f.dm.df <- single.cell.dy.f.dm %>% bind_rows(.id = "cell.id")
single.cell.dy.f.dm.df.2 <- single.cell.dy.f.dm.2 %>% bind_rows(.id = "cell.id")
converged.cells.old <- single.cell.dy.f.dm.df  %>% 
  filter(convcode == 0) %>% 
  mutate(degron = str_split(cell.id, "_", simplify = T)[,4], 
         red = str_split(cell.id, "_", simplify = T)[,5],
         treatment = str_split(cell.id, "_", simplify = T)[,6])

plots

#dis of f
converged.cells %>% 
  ggplot(.,aes(x = f, color = treatment))+
  geom_density(aes(y = ..scaled..))+
  facet_grid(red~degron)


#dm
converged.cells %>% 
  ggplot(.,aes(x = dm, color = treatment))+
  geom_density(aes(y = ..scaled..))+
  facet_grid(red~degron)+
  scale_x_log10()


#dy
converged.cells %>% 
  ggplot(.,aes(x = dy, color = treatment))+
  geom_density(aes(y = ..scaled..))+
  facet_grid(red~degron)+
  scale_x_log10()

#dy
# converged.cells.old %>% 
#   ggplot(.,aes(x = dy, color = treatment))+
#   geom_density(aes(y = ..scaled..))+
#   facet_grid(red~degron)+
#   scale_x_log10()

#half lives
converged.cells %>% 
  ggplot(.,aes(x = log(2)/dy, color = treatment))+
  geom_density(aes(y = ..scaled..))+
  facet_grid(red~degron)


#maturation times
converged.cells %>% 
  filter(treatment == "none") %>% 
  ggplot(.,aes(x = log(2)/dm, color = treatment))+
  geom_density(aes(y = ..scaled..))+
  facet_grid(red~degron)+
  scale_x_log10()


#RSS
converged.cells %>% 
  ggplot(.,aes(x = value, color = treatment))+
  geom_density(aes(y = ..scaled..))+
  facet_grid(red~degron)+
  scale_x_log10()

Average values of the parameters

converged.cells %>% 
  group_by(treatment, red, degron) %>% 
  summarise(dm.avg = mean(dm))
`summarise()` has grouped output by 'treatment', 'red'. You can override using the `.groups` argument.
converged.cells %>% 
  group_by(treatment, red, degron) %>% 
  summarise(f.avg = mean(f),
            dy.avg = mean(dy))
`summarise()` has grouped output by 'treatment', 'red'. You can override using the `.groups` argument.

#without dm just dy and f

#for the degron GFP
single.cell.dy.f.1 <- mclapply(list.of.cells.1, function(a){ 
   
   par.optim <- c(0.5, 0.05005)
   
   names(par.optim) <- c("f", "dy")
   
   df <- a %>% 
            mutate(image.no = image.no-1) %>% 
            group_by(cell.id) %>% 
            mutate(I0_It = gfpMeanBgAFsub/gfpMeanBgAFsub[1],
                   delta.time = delta.time/60) %>% 
     ungroup()
   
   optimx(par = par.optim, #updated this line to match the initial db with exp.field when I am optimizing in a loop
          fn = mechanistic.fn.nodm , 
          method = "L-BFGS-B", 
          lower = c(0, 0.005), 
          upper = c(1, 1), 
          df = df,
          itnmax = 100000)
   }, mc.cores = 40)

#for the stable GFP and the 50uM treatment 
single.cell.dy.f.2<- mclapply(list.of.cells.2, function(a){ 
   
   par.optim <- c(0.5, 0.005005)
   
   names(par.optim) <- c("f", "dy")
   
   df <- a %>% 
            mutate(image.no = image.no-1) %>% 
            group_by(cell.id) %>% 
            mutate(I0_It = gfpMeanBgAFsub/gfpMeanBgAFsub[1],
                   delta.time = delta.time/60) %>% 
     ungroup()
   
   optimx(par = par.optim, #updated this line to match the initial db with exp.field when I am optimizing in a loop
          fn = mechanistic.fn.nodm , 
          method = "L-BFGS-B", 
          lower = c(0, 0.0005), 
          upper = c(1, 0.1), 
          df = df,
          itnmax = 100000)
   }, mc.cores = 40)
single.cell.dy.f.df.1 <- single.cell.dy.f.1 %>% 
  bind_rows(.id = "cell.id")

single.cell.dy.f.df.2 <- single.cell.dy.f.2 %>% 
  bind_rows(.id = "cell.id")
converged.cells.2 <- bind_rows(single.cell.dy.f.df.1,
                               single.cell.dy.f.df.2) %>% 
  filter(convcode == 0) %>% 
  mutate(degron = str_split(cell.id, "_", simplify = T)[,4], 
         red = str_split(cell.id, "_", simplify = T)[,5],
         treatment = str_split(cell.id, "_", simplify = T)[,6])

converged.cells.2.old <- single.cell.dy.f.df %>% 
  filter(convcode == 0) %>% 
  mutate(degron = str_split(cell.id, "_", simplify = T)[,4], 
         red = str_split(cell.id, "_", simplify = T)[,5],
         treatment = str_split(cell.id, "_", simplify = T)[,6])

plots

#exponential

#for degron GFPs
single.cell.dy.1<- mclapply(list.of.cells.1, function(a){ 
   
   par.optim <- c(0.05005)
   
   names(par.optim) <- c("dy")
   
   df <- a %>% 
            mutate(image.no = image.no-1) %>% 
            group_by(cell.id) %>% 
            mutate(I0_It = gfpMeanBgAFsub/gfpMeanBgAFsub[1],
                   delta.time = delta.time/60) %>% 
     ungroup()
   
   optimx(par = par.optim, #updated this line to match the initial db with exp.field when I am optimizing in a loop
          fn = mechanistic.fn.exp , 
          method = "L-BFGS-B", 
          lower = c(0.005), 
          upper = c(1), 
          df = df,
          itnmax = 100000)
   }, mc.cores = 40)

#for stable gfp and 50uM 
single.cell.dy.2 <- mclapply(list.of.cells.2, function(a){ 
   
   par.optim <- c(0.005005)
   
   names(par.optim) <- c("dy")
   
   df <- a %>% 
            mutate(image.no = image.no-1) %>% 
            group_by(cell.id) %>% 
            mutate(I0_It = gfpMeanBgAFsub/gfpMeanBgAFsub[1],
                   delta.time = delta.time/60) %>% 
     ungroup()
   
   optimx(par = par.optim, #updated this line to match the initial db with exp.field when I am optimizing in a loop
          fn = mechanistic.fn.exp , 
          method = "L-BFGS-B", 
          lower = c(0.0005), 
          upper = c(0.1), 
          df = df,
          itnmax = 100000)
   }, mc.cores = 40)
single.cell.dy.df.1 <- single.cell.dy.1 %>% 
  bind_rows(.id = "cell.id")

single.cell.dy.df.2 <- single.cell.dy.2 %>% 
  bind_rows(.id = "cell.id")
converged.cells.3 <- bind_rows(single.cell.dy.df.1,
                               single.cell.dy.df.2) %>% 
  filter(convcode == 0) %>% 
  mutate(degron = str_split(cell.id, "_", simplify = T)[,4], 
         red = str_split(cell.id, "_", simplify = T)[,5],
         treatment = str_split(cell.id, "_", simplify = T)[,6])

converged.cells.3.old <- single.cell.dy.df %>% 
  filter(convcode == 0) %>% 
  mutate(degron = str_split(cell.id, "_", simplify = T)[,4], 
         red = str_split(cell.id, "_", simplify = T)[,5],
         treatment = str_split(cell.id, "_", simplify = T)[,6])

plots

#dy
converged.cells.3 %>% 
  ggplot(.,aes(x = dy, color = treatment))+
  geom_density(aes(y = ..scaled..))+
  facet_grid(red~degron)+
  scale_x_log10() +
  theme(axis.text.x  = element_text(angle = 45))


converged.cells.3.old %>% 
  ggplot(.,aes(x = dy, color = treatment))+
  geom_density(aes(y = ..scaled..))+
  facet_grid(red~degron)+
  scale_x_log10()+
  theme(axis.text.x  = element_text(angle = 45))


#half lives
converged.cells.3 %>% 
  ggplot(.,aes(x = log(2)/dy, color = treatment))+
  geom_density(aes(y = ..scaled..))+
  facet_grid(red~degron)


#rss
converged.cells.3 %>% 
  ggplot(.,aes(x = value, color = treatment))+
  geom_density(aes(y = ..scaled..))+
  facet_grid(red~degron)+
  scale_x_log10()

#without f just dm and dy

single.cell.dy.dm.1 <- mclapply(list.of.cells.1, function(a){ 
   
   par.optim <- c(0.05005, 0.1)
   
   names(par.optim) <- c("dy", "dm")
   
   df <- a %>% 
            mutate(image.no = image.no-1) %>% 
            group_by(cell.id) %>% 
            mutate(I0_It = gfpMeanBgAFsub/gfpMeanBgAFsub[1],
                   delta.time = delta.time/60) %>% 
     ungroup()
   
   optimx(par = par.optim, #updated this line to match the initial db with exp.field when I am optimizing in a loop
          fn = mechanistic.fn.wof, 
          method = "L-BFGS-B", 
          lower = c( 0.005, 0.00001), 
          upper = c( 1, Inf), 
          df = df,
          itnmax = 100000)
   }, mc.cores = 40)

#stable gfp
single.cell.dy.dm.2 <- mclapply(list.of.cells.2, function(a){ 
   
   par.optim <- c(0.005, 0.1)
   
   names(par.optim) <- c("dy", "dm")
   
   df <- a %>% 
            mutate(image.no = image.no-1) %>% 
            group_by(cell.id) %>% 
            mutate(I0_It = gfpMeanBgAFsub/gfpMeanBgAFsub[1],
                   delta.time = delta.time/60) %>% 
     ungroup()
   
   optimx(par = par.optim, #updated this line to match the initial db with exp.field when I am optimizing in a loop
          fn = mechanistic.fn.wof, 
          method = "L-BFGS-B", 
          lower = c( 0.0005, 0.00001), 
          upper = c( 0.1, Inf), 
          df = df,
          itnmax = 100000)
   }, mc.cores = 40)
single.cell.dy.dm.df.1 <- single.cell.dy.dm.1 %>% bind_rows(.id = "cell.id")
single.cell.dy.dm.df.2 <- single.cell.dy.dm.2 %>% bind_rows(.id = "cell.id")
converged.cells.4.old <- single.cell.dy.dm.df %>% 
  filter(convcode == 0) %>% 
  mutate(degron = str_split(cell.id, "_", simplify = T)[,4], 
         red = str_split(cell.id, "_", simplify = T)[,5],
         treatment = str_split(cell.id, "_", simplify = T)[,6])

converged.cells.4 <- bind_rows(single.cell.dy.dm.df.1,
                               single.cell.dy.dm.df.2) %>% 
  filter(convcode == 0) %>% 
  mutate(degron = str_split(cell.id, "_", simplify = T)[,4], 
         red = str_split(cell.id, "_", simplify = T)[,5],
         treatment = str_split(cell.id, "_", simplify = T)[,6])

plots

dm vs gfp intensity

AIC function equation from the paper: McShane et al 2016 : Kinetic analysis of protein degradation reveals age dependent degradation.

#for a small sample space, you add a correction 2k(K+1)/(n-k-1) AIC = 2k + n log(RSS/n) + 2k(K+1)/(n-k-1)

n = no. of data points (31) k = no. of parameters c(1,2,3) RSS = Residual sum of squares

exp((AICmin − AICi)/2) can be interpreted as being proportional to the probability that the ith model minimizes the (estimated) information loss.

aic.fn <- function(df,n){
  
  df <- df %>% 
    mutate(aic = 2*k + n*log(value/n) ) #without the correction for small sample space
  return(df)
}

Old values

#for three par model
aic.dy.f.dm.old <- aic.fn(converged.cells.old, k = 3, n = 31) %>% 
  rename("dy.all" = "dy", 
         "f.all" = "f",
         "dm.all" = "dm",
         "rss.all" = "value") %>% 
  select(cell.id, dy.all, f.all, dm.all, rss.all, aic.all, treatment, red, degron)

#for dy and f model only
aic.dy.f.old <- aic.fn(converged.cells.2.old, k = 2, n = 31) %>% 
  rename("dy.2" = "dy", 
         "f.2" = "f",
         "rss.2" = "value",
         "aic.dy.f" = "aic.all")  %>% 
  select(cell.id, dy.2, f.2, rss.2, aic.dy.f,treatment, red, degron)

#exponential
aic.dy.old <- aic.fn(converged.cells.3.old, k = 1, n = 31) %>% 
  rename("dy.exp" = "dy", 
         "rss.exp" = "value",
         "aic.exp" = "aic.all") %>% 
  select(cell.id, dy.exp, rss.exp, aic.exp,treatment, red, degron)

#mat and decay
aic.dy.dm.old <- aic.fn(converged.cells.4.old, k = 2, n = 31) %>%  
  rename("dy.mat" = "dy", 
         "dm.mat" = "dm",
         "rss.mat" = "value",
         "aic.mat" = "aic.all")  %>% 
  select(cell.id, dy.mat, dm.mat,rss.mat, aic.mat,treatment, red, degron)
all.model.parm <- all.model.parm %>% 
  mutate(k = case_when(model == "dy.dm.f" ~ 3,
                       model %in% c("dy.f","dy.dm") ~ 2,
                       model == "exponential" ~ 1))
aic.df <- aic.fn(all.model.parm, n = 31) %>% 
  group_by(cell.id) %>% 
  arrange(cell.id) %>% 
  ungroup()

Comparing AIC values

aic.df %>%
  filter(treatment %in% c("none","dmso1","dmso2")) %>% 
  ggplot(.,aes(x = aic.all, y = aic.dy.f, color = treatment))+
  geom_point(alpha = 0.2)+
  geom_abline(slope = 1)+
  facet_grid(red~degron, scales = "free")


aic.df %>%
  filter(treatment %in% c("none","dmso1","dmso2")) %>% 
  ggplot(.,aes(x = aic.all, y = aic.exp, color = treatment))+
  geom_point(alpha = 0.2)+
  geom_abline(slope = 1)+
  facet_grid(red~degron)


aic.df %>%
  filter(treatment %in% c("none","dmso1","dmso2")) %>% 
  ggplot(.,aes(x = aic.all, y = aic.mat, color = treatment))+
  geom_point(alpha = 0.2)+
  geom_abline(slope = 1)+
  facet_grid(red~degron)


#for the treatment exps
aic.df %>%
  filter(treatment != "none") %>% 
  ggplot(.,aes(x = aic.all, y = aic.mat))+
  geom_point(alpha = 0.2)+
  geom_abline(slope = 1)+
  facet_wrap(~treatment)


aic.df %>%
  filter(treatment != "none") %>% 
  ggplot(.,aes(x = aic.all, y = aic.dy.f))+
  geom_point(alpha = 0.2)+
  geom_abline(slope = 1)+
  facet_wrap(~treatment)


aic.df %>%
  filter(treatment != "none") %>% 
  ggplot(.,aes(x = aic.all, y = aic.exp))+
  geom_point(alpha = 0.2)+
  geom_abline(slope = 1)+
  facet_wrap(~treatment)

NA
NA
#repeate 2
aic.df %>% 
  filter(degron == "cln2.2" & red == "pup1-rfp") %>% 
  select(contains("aic")) %>% 
  ggpairs()

 plot: [1,1] [====>--------------------------------------------------------------------]  6% est: 0s 
 plot: [1,2] [========>----------------------------------------------------------------] 12% est: 1s 
 plot: [1,3] [=============>-----------------------------------------------------------] 19% est: 1s 
 plot: [1,4] [=================>-------------------------------------------------------] 25% est: 1s 
 plot: [2,1] [======================>--------------------------------------------------] 31% est: 1s 
 plot: [2,2] [==========================>----------------------------------------------] 38% est: 1s 
 plot: [2,3] [===============================>-----------------------------------------] 44% est: 1s 
 plot: [2,4] [===================================>-------------------------------------] 50% est: 1s 
 plot: [3,1] [========================================>--------------------------------] 56% est: 0s 
 plot: [3,2] [=============================================>---------------------------] 62% est: 0s 
 plot: [3,3] [=================================================>-----------------------] 69% est: 0s 
 plot: [3,4] [======================================================>------------------] 75% est: 0s 
 plot: [4,1] [==========================================================>--------------] 81% est: 0s 
 plot: [4,2] [===============================================================>---------] 88% est: 0s 
 plot: [4,3] [===================================================================>-----] 94% est: 0s 
 plot: [4,4] [=========================================================================]100% est: 0s 
                                                                                                     

#repeate 1
aic.df %>% 
  filter(degron == "cln2" & red == "pup1-rfp") %>% 
  select(contains("aic")) %>% 
  ggpairs()

 plot: [1,1] [====>--------------------------------------------------------------------]  6% est: 0s 
 plot: [1,2] [========>----------------------------------------------------------------] 12% est: 0s 
 plot: [1,3] [=============>-----------------------------------------------------------] 19% est: 1s 
 plot: [1,4] [=================>-------------------------------------------------------] 25% est: 1s 
 plot: [2,1] [======================>--------------------------------------------------] 31% est: 1s 
 plot: [2,2] [==========================>----------------------------------------------] 38% est: 1s 
 plot: [2,3] [===============================>-----------------------------------------] 44% est: 1s 
 plot: [2,4] [===================================>-------------------------------------] 50% est: 1s 
 plot: [3,1] [========================================>--------------------------------] 56% est: 1s 
 plot: [3,2] [=============================================>---------------------------] 62% est: 0s 
 plot: [3,3] [=================================================>-----------------------] 69% est: 0s 
 plot: [3,4] [======================================================>------------------] 75% est: 0s 
 plot: [4,1] [==========================================================>--------------] 81% est: 0s 
 plot: [4,2] [===============================================================>---------] 88% est: 0s 
 plot: [4,3] [===================================================================>-----] 94% est: 0s 
 plot: [4,4] [=========================================================================]100% est: 0s 
                                                                                                     

aic.df %>% 
  filter(degron == "cln2.2" & red == "tef2-mCherry") %>% 
  select(contains("aic")) %>% 
  ggpairs()

 plot: [1,1] [====>--------------------------------------------------------------------]  6% est: 0s 
 plot: [1,2] [========>----------------------------------------------------------------] 12% est: 0s 
 plot: [1,3] [=============>-----------------------------------------------------------] 19% est: 0s 
 plot: [1,4] [=================>-------------------------------------------------------] 25% est: 1s 
 plot: [2,1] [======================>--------------------------------------------------] 31% est: 1s 
 plot: [2,2] [==========================>----------------------------------------------] 38% est: 0s 
 plot: [2,3] [===============================>-----------------------------------------] 44% est: 0s 
 plot: [2,4] [===================================>-------------------------------------] 50% est: 0s 
 plot: [3,1] [========================================>--------------------------------] 56% est: 0s 
 plot: [3,2] [=============================================>---------------------------] 62% est: 0s 
 plot: [3,3] [=================================================>-----------------------] 69% est: 0s 
 plot: [3,4] [======================================================>------------------] 75% est: 0s 
 plot: [4,1] [==========================================================>--------------] 81% est: 0s 
 plot: [4,2] [===============================================================>---------] 88% est: 0s 
 plot: [4,3] [===================================================================>-----] 94% est: 0s 
 plot: [4,4] [=========================================================================]100% est: 0s 
                                                                                                     

aic.df %>% 
  filter(degron == "cln2" & red == "tef2-mCherry") %>% 
  select(contains("aic")) %>% 
  ggpairs()

 plot: [1,1] [====>--------------------------------------------------------------------]  6% est: 0s 
 plot: [1,2] [========>----------------------------------------------------------------] 12% est: 0s 
 plot: [1,3] [=============>-----------------------------------------------------------] 19% est: 0s 
 plot: [1,4] [=================>-------------------------------------------------------] 25% est: 1s 
 plot: [2,1] [======================>--------------------------------------------------] 31% est: 0s 
 plot: [2,2] [==========================>----------------------------------------------] 38% est: 0s 
 plot: [2,3] [===============================>-----------------------------------------] 44% est: 0s 
 plot: [2,4] [===================================>-------------------------------------] 50% est: 0s 
 plot: [3,1] [========================================>--------------------------------] 56% est: 0s 
 plot: [3,2] [=============================================>---------------------------] 62% est: 0s 
 plot: [3,3] [=================================================>-----------------------] 69% est: 0s 
 plot: [3,4] [======================================================>------------------] 75% est: 0s 
 plot: [4,1] [==========================================================>--------------] 81% est: 0s 
 plot: [4,2] [===============================================================>---------] 88% est: 0s 
 plot: [4,3] [===================================================================>-----] 94% est: 0s 
 plot: [4,4] [=========================================================================]100% est: 0s 
                                                                                                     

aic.df %>% 
  filter(degron == "mODC.2" & red == "pup1-rfp") %>% 
  select(contains("aic")) %>% 
  ggpairs()

 plot: [1,1] [====>--------------------------------------------------------------------]  6% est: 0s 
 plot: [1,2] [========>----------------------------------------------------------------] 12% est: 1s 
 plot: [1,3] [=============>-----------------------------------------------------------] 19% est: 1s 
 plot: [1,4] [=================>-------------------------------------------------------] 25% est: 1s 
 plot: [2,1] [======================>--------------------------------------------------] 31% est: 1s 
 plot: [2,2] [==========================>----------------------------------------------] 38% est: 1s 
 plot: [2,3] [===============================>-----------------------------------------] 44% est: 1s 
 plot: [2,4] [===================================>-------------------------------------] 50% est: 1s 
 plot: [3,1] [========================================>--------------------------------] 56% est: 0s 
 plot: [3,2] [=============================================>---------------------------] 62% est: 0s 
 plot: [3,3] [=================================================>-----------------------] 69% est: 0s 
 plot: [3,4] [======================================================>------------------] 75% est: 0s 
 plot: [4,1] [==========================================================>--------------] 81% est: 0s 
 plot: [4,2] [===============================================================>---------] 88% est: 0s 
 plot: [4,3] [===================================================================>-----] 94% est: 0s 
 plot: [4,4] [=========================================================================]100% est: 0s 
                                                                                                     

aic.df %>% 
  filter(degron == "mODC" & red == "pup1-rfp", treatment == "none") %>% 
  select(contains("aic")) %>% 
  ggpairs()

 plot: [1,1] [====>--------------------------------------------------------------------]  6% est: 0s 
 plot: [1,2] [========>----------------------------------------------------------------] 12% est: 0s 
 plot: [1,3] [=============>-----------------------------------------------------------] 19% est: 0s 
 plot: [1,4] [=================>-------------------------------------------------------] 25% est: 0s 
 plot: [2,1] [======================>--------------------------------------------------] 31% est: 0s 
 plot: [2,2] [==========================>----------------------------------------------] 38% est: 0s 
 plot: [2,3] [===============================>-----------------------------------------] 44% est: 0s 
 plot: [2,4] [===================================>-------------------------------------] 50% est: 0s 
 plot: [3,1] [========================================>--------------------------------] 56% est: 0s 
 plot: [3,2] [=============================================>---------------------------] 62% est: 0s 
 plot: [3,3] [=================================================>-----------------------] 69% est: 0s 
 plot: [3,4] [======================================================>------------------] 75% est: 0s 
 plot: [4,1] [==========================================================>--------------] 81% est: 0s 
 plot: [4,2] [===============================================================>---------] 88% est: 0s 
 plot: [4,3] [===================================================================>-----] 94% est: 0s 
 plot: [4,4] [=========================================================================]100% est: 0s 
                                                                                                     

aic.df %>% 
  filter(degron == "mODC.2" & red == "tef2-mCherry") %>% 
  select(contains("aic")) %>% 
  ggpairs()

 plot: [1,1] [====>--------------------------------------------------------------------]  6% est: 0s 
 plot: [1,2] [========>----------------------------------------------------------------] 12% est: 0s 
 plot: [1,3] [=============>-----------------------------------------------------------] 19% est: 0s 
 plot: [1,4] [=================>-------------------------------------------------------] 25% est: 0s 
 plot: [2,1] [======================>--------------------------------------------------] 31% est: 0s 
 plot: [2,2] [==========================>----------------------------------------------] 38% est: 0s 
 plot: [2,3] [===============================>-----------------------------------------] 44% est: 0s 
 plot: [2,4] [===================================>-------------------------------------] 50% est: 0s 
 plot: [3,1] [========================================>--------------------------------] 56% est: 0s 
 plot: [3,2] [=============================================>---------------------------] 62% est: 0s 
 plot: [3,3] [=================================================>-----------------------] 69% est: 0s 
 plot: [3,4] [======================================================>------------------] 75% est: 0s 
 plot: [4,1] [==========================================================>--------------] 81% est: 0s 
 plot: [4,2] [===============================================================>---------] 88% est: 0s 
 plot: [4,3] [===================================================================>-----] 94% est: 0s 
 plot: [4,4] [=========================================================================]100% est: 0s 
                                                                                                     

aic.df %>% 
  filter(degron == "mODC" & red == "tef2-mCherry") %>% 
  select(contains("aic")) %>% 
  ggpairs()

 plot: [1,1] [====>--------------------------------------------------------------------]  6% est: 0s 
 plot: [1,2] [========>----------------------------------------------------------------] 12% est: 1s 
 plot: [1,3] [=============>-----------------------------------------------------------] 19% est: 1s 
 plot: [1,4] [=================>-------------------------------------------------------] 25% est: 1s 
 plot: [2,1] [======================>--------------------------------------------------] 31% est: 1s 
 plot: [2,2] [==========================>----------------------------------------------] 38% est: 1s 
 plot: [2,3] [===============================>-----------------------------------------] 44% est: 1s 
 plot: [2,4] [===================================>-------------------------------------] 50% est: 1s 
 plot: [3,1] [========================================>--------------------------------] 56% est: 1s 
 plot: [3,2] [=============================================>---------------------------] 62% est: 0s 
 plot: [3,3] [=================================================>-----------------------] 69% est: 0s 
 plot: [3,4] [======================================================>------------------] 75% est: 0s 
 plot: [4,1] [==========================================================>--------------] 81% est: 0s 
 plot: [4,2] [===============================================================>---------] 88% est: 0s 
 plot: [4,3] [===================================================================>-----] 94% est: 0s 
 plot: [4,4] [=========================================================================]100% est: 0s 
                                                                                                     

Distribution of the best fit model

comparing the rates of decay from various models

aic.df %>%
  filter(treatment %in% c("none","dmso1","dmso2"), 
         dy.all < 1, dy.2 <1, dy.exp <1 , dy.mat <1) %>% 
  ggplot(.,aes(x = dy.all, y = dy.2, color = treatment))+
  geom_point(alpha = 0.2)+
  geom_abline(slope = 1)+
  facet_grid(red~degron, scales = "free")+
  scale_x_log10()+
  scale_y_log10()+
  xlab("rate of decay from the 3 par model")+
  ylab("rate of decay from 2 par model (f, dy)")


aic.df %>%
  filter(treatment %in% c("none","dmso1","dmso2"), 
         dy.all < 1, dy.2 <1, dy.exp <1 , dy.mat <1)  %>% 
  ggplot(.,aes(x = dy.all, y = dy.exp, color = treatment))+
  geom_point(alpha = 0.2)+
  geom_abline(slope = 1)+
  facet_grid(red~degron, scales = "free")+
  scale_x_log10()+
  scale_y_log10()+
  xlab("rate of decay from the 3 par model")+
  ylab("rate of decay from 1 par model ( dy)")


aic.df %>%
  filter(treatment %in% c("none","dmso1","dmso2"), 
         dy.all < 1, dy.2 <1, dy.exp <1 , dy.mat <1) %>% 
  ggplot(.,aes(x = dy.all, y = dy.mat, color = treatment))+
  geom_point(alpha = 0.2)+
  geom_abline(slope = 1)+
  facet_grid(red~degron, scales = "free")+
  scale_x_log10()+
  scale_y_log10()+
  xlab("rate of decay from the 3 par model")+
  ylab("rate of decay from 2 par model ( dy, dm)")

maturation rates

aic.df %>%
  filter(treatment %in% c("none","dmso1","dmso2"), 
         dy.all < 1, dy.2 <1, dy.exp <1 , dy.mat <1) %>% 
  ggplot(.,aes(x = dm.all, y = dm.mat, color = treatment))+
  geom_point(alpha = 0.2)+
  geom_abline(slope = 1)+
  facet_grid(red~degron, scales = "free")+
  scale_x_log10()+
  scale_y_log10()+
  xlab("rate of maturation from the 3 par model")+
  ylab("rate of maturation from 2 par model ( dy, dm)")

f values

aic.df %>%
  filter(treatment %in% c("none"), 
         dy.all < 1, dy.2 <1, dy.exp <1 , dy.mat <1) %>% 
  ggplot(.,aes(x = f.all, y = f.2, color = treatment))+
  geom_point(alpha = 0.2)+
  geom_abline(slope = 1)+
  facet_grid(red~degron, scales = "free")+
  xlab("frac of translation from the 3 par model")+
  ylab("frac of translation from 2 par model ( dy, f)")
aic.df %>%
  filter(treatment %in% c("none"), 
         dy.all < 1, dy.2 <1, dy.exp <1 , dy.mat <1) %>% 
  group_by(treatment, red, degron) %>% 
  summarise(avg.dy.all = mean(dy.all),
            avg.dy.2 = mean(dy.2),
            avg.dy.exp = mean(dy.exp),
            avg.dy.mat = mean(dy.mat))

#decay rate distribution plots

aic.df %>%
  filter(treatment %in% c("none"), 
         dy.all < 1, dy.2 <1, dy.exp <1 , dy.mat <1) %>% 
  select(cell.id, dy.all, dy.2, dy.exp, dy.mat, treatment, red, degron) %>% 
  pivot_longer(cols = 2:5) %>% 
  ggplot(.,aes(x = value,  fill = name))+
  geom_histogram( alpha = 0.5)+
  facet_grid(red~degron, scales = "free")+
  scale_x_log10()+
  theme_pubr()
`stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

aic.df %>%
  filter(treatment %in% c("none"), 
         dy.all < 1, dy.2 <1, dy.exp <1 , dy.mat <1 , 
         degron == "cln2.2") %>% 
  select(cell.id, dy.all, dy.2, dy.exp, dy.mat, treatment, red, degron) %>% 
  pivot_longer(cols = 2:5) %>% 
  ggplot(.,aes(x = log(2)/value,  fill = name))+
  geom_density( aes(y = ..scaled..),alpha = 0.5)+
  facet_grid(red~degron, scales = "free")+
  theme_pubr()+
  scale_x_continuous()


aic.df %>%
  filter(treatment %in% c("none"), 
         dy.all < 1, dy.2 <1, dy.exp <1 , dy.mat <1 , 
         degron %in% c("mODC","mODC.2") ) %>% 
  select(cell.id, dy.all, dy.2, dy.exp, dy.mat, treatment, red, degron) %>% 
  pivot_longer(cols = 2:5) %>% 
  ggplot(.,aes(x = log(2)/value,  fill = name))+
  geom_density( aes(y = ..scaled..),alpha = 0.5)+
  facet_grid(red~degron, scales = "free")+
  theme_pubr()+
  scale_x_continuous()

NA
aic.df %>%
  filter(treatment %in% c("none"), 
         dy.all < 1, dy.2 <1, dy.exp <1 , dy.mat <1 , 
         degron == "cln2.2", 
         red == "pup1-rfp") %>% 
  select(cell.id, dy.all, dy.2, dy.exp, dy.mat, treatment, red, degron) %>% 
  select(contains("dy")) %>% 
  ggpairs()

 plot: [1,1] [====>--------------------------------------------------------------------]  6% est: 0s 
 plot: [1,2] [========>----------------------------------------------------------------] 12% est: 0s 
 plot: [1,3] [=============>-----------------------------------------------------------] 19% est: 0s 
 plot: [1,4] [=================>-------------------------------------------------------] 25% est: 0s 
 plot: [2,1] [======================>--------------------------------------------------] 31% est: 0s 
 plot: [2,2] [==========================>----------------------------------------------] 38% est: 0s 
 plot: [2,3] [===============================>-----------------------------------------] 44% est: 0s 
 plot: [2,4] [===================================>-------------------------------------] 50% est: 0s 
 plot: [3,1] [========================================>--------------------------------] 56% est: 0s 
 plot: [3,2] [=============================================>---------------------------] 62% est: 0s 
 plot: [3,3] [=================================================>-----------------------] 69% est: 0s 
 plot: [3,4] [======================================================>------------------] 75% est: 0s 
 plot: [4,1] [==========================================================>--------------] 81% est: 0s 
 plot: [4,2] [===============================================================>---------] 88% est: 0s 
 plot: [4,3] [===================================================================>-----] 94% est: 0s 
 plot: [4,4] [=========================================================================]100% est: 0s 
                                                                                                     

aic.df %>%
  filter(treatment %in% c("none"), 
         dy.all < 1, dy.2 <1, dy.exp <1 , dy.mat <1 , 
         degron == "cln2.2", 
         red == "tef2-mCherry") %>% 
  select(cell.id, dy.all, dy.2, dy.exp, dy.mat, treatment, red, degron) %>% 
  select(contains("dy")) %>% 
  ggpairs()

 plot: [1,1] [====>--------------------------------------------------------------------]  6% est: 0s 
 plot: [1,2] [========>----------------------------------------------------------------] 12% est: 0s 
 plot: [1,3] [=============>-----------------------------------------------------------] 19% est: 0s 
 plot: [1,4] [=================>-------------------------------------------------------] 25% est: 0s 
 plot: [2,1] [======================>--------------------------------------------------] 31% est: 0s 
 plot: [2,2] [==========================>----------------------------------------------] 38% est: 0s 
 plot: [2,3] [===============================>-----------------------------------------] 44% est: 0s 
 plot: [2,4] [===================================>-------------------------------------] 50% est: 0s 
 plot: [3,1] [========================================>--------------------------------] 56% est: 0s 
 plot: [3,2] [=============================================>---------------------------] 62% est: 0s 
 plot: [3,3] [=================================================>-----------------------] 69% est: 0s 
 plot: [3,4] [======================================================>------------------] 75% est: 0s 
 plot: [4,1] [==========================================================>--------------] 81% est: 0s 
 plot: [4,2] [===============================================================>---------] 88% est: 0s 
 plot: [4,3] [===================================================================>-----] 94% est: 0s 
 plot: [4,4] [=========================================================================]100% est: 0s 
                                                                                                     

aic.df %>%
  filter(treatment %in% c("none"), 
         dy.all < 1, dy.2 <1, dy.exp <1 , dy.mat <1 , 
         degron == "mODC.2", 
         red == "pup1-rfp") %>% 
  select(cell.id, dy.all, dy.2, dy.exp, dy.mat, treatment, red, degron) %>% 
  select(contains("dy")) %>% 
  ggpairs()

 plot: [1,1] [====>--------------------------------------------------------------------]  6% est: 0s 
 plot: [1,2] [========>----------------------------------------------------------------] 12% est: 1s 
 plot: [1,3] [=============>-----------------------------------------------------------] 19% est: 1s 
 plot: [1,4] [=================>-------------------------------------------------------] 25% est: 1s 
 plot: [2,1] [======================>--------------------------------------------------] 31% est: 1s 
 plot: [2,2] [==========================>----------------------------------------------] 38% est: 1s 
 plot: [2,3] [===============================>-----------------------------------------] 44% est: 1s 
 plot: [2,4] [===================================>-------------------------------------] 50% est: 1s 
 plot: [3,1] [========================================>--------------------------------] 56% est: 0s 
 plot: [3,2] [=============================================>---------------------------] 62% est: 0s 
 plot: [3,3] [=================================================>-----------------------] 69% est: 0s 
 plot: [3,4] [======================================================>------------------] 75% est: 0s 
 plot: [4,1] [==========================================================>--------------] 81% est: 0s 
 plot: [4,2] [===============================================================>---------] 88% est: 0s 
 plot: [4,3] [===================================================================>-----] 94% est: 0s 
 plot: [4,4] [=========================================================================]100% est: 0s 
                                                                                                     

aic.df %>%
  filter(treatment %in% c("none"), 
         dy.all < 1, dy.2 <1, dy.exp <1 , dy.mat <1 , 
         degron == "mODC.2", 
         red == "tef2-mCherry") %>% 
  select(cell.id, dy.all, dy.2, dy.exp, dy.mat, treatment, red, degron) %>% 
  select(contains("dy")) %>% 
  ggpairs()

 plot: [1,1] [====>--------------------------------------------------------------------]  6% est: 0s 
 plot: [1,2] [========>----------------------------------------------------------------] 12% est: 0s 
 plot: [1,3] [=============>-----------------------------------------------------------] 19% est: 0s 
 plot: [1,4] [=================>-------------------------------------------------------] 25% est: 0s 
 plot: [2,1] [======================>--------------------------------------------------] 31% est: 0s 
 plot: [2,2] [==========================>----------------------------------------------] 38% est: 0s 
 plot: [2,3] [===============================>-----------------------------------------] 44% est: 0s 
 plot: [2,4] [===================================>-------------------------------------] 50% est: 0s 
 plot: [3,1] [========================================>--------------------------------] 56% est: 0s 
 plot: [3,2] [=============================================>---------------------------] 62% est: 0s 
 plot: [3,3] [=================================================>-----------------------] 69% est: 0s 
 plot: [3,4] [======================================================>------------------] 75% est: 0s 
 plot: [4,1] [==========================================================>--------------] 81% est: 0s 
 plot: [4,2] [===============================================================>---------] 88% est: 0s 
 plot: [4,3] [===================================================================>-----] 94% est: 0s 
 plot: [4,4] [=========================================================================]100% est: 0s 
                                                                                                     

when you add proteasome inhibtor, there

#Saving the data

read_csv("~/plots/all_data/aic.csv") %>% 
  bind_rows(.,aic.df) %>% 
  write_csv(.,path = "~/plots/all_data/aic.csv")
Rows: 55379 Columns: 18
── Column specification ───────────────────────────────────────────────────────────────────────────────
Delimiter: ","
chr  (5): cell.id, degron, red, treatment, model
dbl (10): f, dy, dm, value, fevals, gevals, convcode, xtime, k, aic
lgl  (3): niter, kkt1, kkt2

ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
# all.model.parm %>% 
#   write_csv(.,"~/plots/all_data/model_parms_2.csv")

# all.model.parm2 <- read_csv("~/plots/all_data/model_parms_2.csv") %>% 
#   filter(!(degron %in% c("stable", "stable.2") | treatment == "50uM")) %>% 
#   bind_rows(.,all.model.parm) 
#   
#   
# all.model.parm2 %>% 
#   write_csv(.,"~/plots/all_data/model_parms_2.csv")

#10-18-22
read_csv("~/plots/all_data/model_parms_2.csv") %>% 
  bind_rows(.,all.model.parm) %>% 
  write_csv(.,"~/plots/all_data/model_parms_2.csv")

decay rate distribution with maturation model


aic.df %>%
  filter(treatment %in% c("none"), 
         dy.all < 1, dy.2 <1, dy.exp <1 , dy.mat <1 , 
         degron == "cln2.2") %>% 
  select(cell.id, dy.all, dy.2, dy.exp, dy.mat, treatment, red, degron) %>% 
  pivot_longer(cols = 2:5) %>% 
  ggplot(.,aes(x = log(2)/value,  fill = name))+
  geom_density( aes(y = ..scaled..),alpha = 0.5)+
  facet_grid(red~degron, scales = "free")+
  theme_pubr()+
  scale_x_continuous()
Error in `filter()`:
! Problem while computing `..2 = dy.all < 1`.
Caused by error in `mask$eval_all_filter()`:
! object 'dy.all' not found
Backtrace:
  1. ... %>% ggplot(., aes(x = log(2) / value, fill = name))
  6. dplyr:::filter.data.frame(...)
  7. dplyr:::filter_rows(.data, ..., caller_env = caller_env())
  8. dplyr:::filter_eval(dots, mask = mask, error_call = error_call)
 10. mask$eval_all_filter(dots, env_filter)
aic.df %>%
  filter(treatment %in% c("none"), 
         dy.all < 1, dy.2 <1, dy.exp <1 , dy.mat <1 , 
         degron %in% c("mODC","mODC.2") ) %>% 
  select(cell.id, dy.mat, treatment, red, degron) %>% 
  left_join(.,bind_rows(list.of.cells) %>% filter(delta.time == 0), by = c("cell.id","red","degron","treatment")) %>% 
  ggplot(.,aes(y = dy.mat, x = gfpMeanBgAFsub, color = degron))+
  geom_point( alpha = 0.5)+
  facet_wrap(~red, scales = "free")+
  theme_pubr()+
  scale_x_continuous()+
  stat_cor()


aic.df %>%
  filter(treatment %in% c("none"), 
         dy.all < 1, dy.2 <1, dy.exp <1 , dy.mat <1 , 
         degron %in% c("mODC","mODC.2") ) %>% 
  select(cell.id, dy.2, treatment, red, degron) %>% 
  left_join(.,bind_rows(list.of.cells) %>% filter(delta.time == 0), by = c("cell.id","red","degron","treatment")) %>% 
  ggplot(.,aes(y = dy.2, x = gfpMeanBgAFsub, color = degron))+
  geom_point( alpha = 0.5)+
  facet_wrap(~red, scales = "free")+
  theme_pubr()+
  scale_x_continuous()+
  stat_cor()


aic.df %>%
  filter(treatment %in% c("none"), 
         dy.all < 1, dy.2 <1, dy.exp <1 , dy.mat <1 , 
         degron %in% c("mODC","mODC.2") ) %>% 
  select(cell.id, dy.all, treatment, red, degron) %>% 
  left_join(.,bind_rows(list.of.cells) %>% filter(delta.time == 0), by = c("cell.id","red","degron","treatment")) %>% 
  ggplot(.,aes(y = dy.all, x = gfpMeanBgAFsub, color = degron))+
  geom_point( alpha = 0.5)+
  facet_wrap(~red, scales = "free")+
  theme_pubr()+
  scale_x_continuous()+
  stat_cor()


aic.df %>%
  filter(treatment %in% c("none"), 
         dy.all < 1, dy.2 <1, dy.exp <1 , dy.mat <1 , 
         degron %in% c("mODC","mODC.2") ) %>% 
  select(cell.id, dy.exp, treatment, red, degron) %>% 
  left_join(.,bind_rows(list.of.cells) %>% filter(delta.time == 0), by = c("cell.id","red","degron","treatment")) %>% 
  ggplot(.,aes(y = dy.exp, x = gfpMeanBgAFsub, color = degron))+
  geom_point( alpha = 0.5)+
  facet_wrap(~red, scales = "free")+
  theme_pubr()+
  scale_x_continuous()+
  stat_cor()

 
aic.df %>%
  filter(treatment %in% c("none"), 
         dy.all < 1, dy.2 <1, dy.exp <1 , dy.mat <1 , 
         degron %in% c("cln2","cln2.2") ) %>% 
  select(cell.id, dy.mat, treatment, red, degron) %>% 
  left_join(.,bind_rows(list.of.cells) %>% filter(delta.time == 0), by = c("cell.id","red","degron","treatment")) %>% 
  ggplot(.,aes(y = dy.mat, x = gfpMeanBgAFsub, color = degron))+
  geom_point( alpha = 0.5)+
  facet_grid(~red, scales = "free")+
  theme_pubr()+
  scale_x_continuous()+
  stat_cor()


aic.df %>%
  filter(treatment %in% c("none"), 
         dy.all < 1, dy.2 <1, dy.exp <1 , dy.mat <1 , 
         degron %in% c("cln2","cln2.2") ) %>% 
  select(cell.id, dy.2, treatment, red, degron) %>% 
  left_join(.,bind_rows(list.of.cells) %>% filter(delta.time == 0), by = c("cell.id","red","degron","treatment")) %>% 
  ggplot(.,aes(y = dy.2, x = gfpMeanBgAFsub, color = degron))+
  geom_point( alpha = 0.5)+
  facet_grid(~red, scales = "free")+
  theme_pubr()+
  scale_x_continuous()+
  stat_cor()


aic.df %>%
  filter(treatment %in% c("none"), 
         dy.all < 1, dy.2 <1, dy.exp <1 , dy.mat <1 , 
         degron %in% c("cln2","cln2.2") ) %>% 
  select(cell.id, dy.exp, treatment, red, degron) %>% 
  left_join(.,bind_rows(list.of.cells) %>% filter(delta.time == 0), by = c("cell.id","red","degron","treatment")) %>% 
  ggplot(.,aes(y = dy.exp, x = gfpMeanBgAFsub, color = degron))+
  geom_point( alpha = 0.5)+
  facet_grid(~red, scales = "free")+
  theme_pubr()+
  scale_x_continuous()+
  stat_cor()


aic.df %>%
  filter(treatment %in% c("none"), 
         dy.all < 1, dy.2 <1, dy.exp <1 , dy.mat <1 , 
         degron %in% c("cln2","cln2.2") ) %>% 
  select(cell.id, dy.all, treatment, red, degron) %>% 
  left_join(.,bind_rows(list.of.cells) %>% filter(delta.time == 0), by = c("cell.id","red","degron","treatment")) %>% 
  ggplot(.,aes(y = dy.all, x = gfpMeanBgAFsub, color = degron))+
  geom_point( alpha = 0.5)+
  facet_grid(~red, scales = "free")+
  theme_pubr()+
  scale_x_continuous()+
  stat_cor()

LS0tCnRpdGxlOiAiYW5hbHl6ZSB0aGUgc2F0dXJhdGlvbiBNTiBraW5ldGljcyBwYXJhbWV0ZXIiCm91dHB1dDogaHRtbF9ub3RlYm9vawotLS0KCmBgYHtyfQpsaWJyYXJ5KHBhcmFsbGVsKQpsaWJyYXJ5KG9wdGlteCkKbGlicmFyeShHR2FsbHkpCmBgYAoKYGBge3IgfQpjaXRhdGlvbihwYWNrYWdlID0gIm9wdGlteCIpCmBgYAoKYGBge3J9Cmxpc3Qub2YuY2VsbHMgPC0gcmVhZF9jc3YoIn4vcGxvdHMvYWxsX2RhdGEvYWxsX2V4cF9kYXRhLmNzdiIpICU+JSBzcGxpdCguJGNlbGwuaWQpCmBgYAoKYGBge3J9CiNmb3Igbm9uIHRyZWF0ZWQgKG5vIERNU08gY2VsbHMpY2VsbHMgYWxsIHRoZSB0aHJlZSBHRlBzCmJpbmRfcm93cyhsaXN0Lm9mLmNlbGxzKSAlPiUgCiAgZmlsdGVyKCB0cmVhdG1lbnQgPT0gIm5vbmUiLCByZWQgPT0gInB1cDEtcmZwIikgJT4lIAogIGdyb3VwX2J5KGNlbGwuaWQpICU+JSAKICBtdXRhdGUoSXRfSTAgPSBnZnBNZWFuQmdBRnN1Yi9nZnBNZWFuQmdBRnN1YlsxXSkgJT4lIAogIGdncGxvdCguLGFlcyh4ID0gZGVsdGEudGltZS82MCwgeSA9IGdmcE1lYW5CZ0FGc3ViICwgZ3JvdXBfYnkgPSBjZWxsLmlkICkpKwogIGdlb21fbGluZShhbHBoYSA9IDAuMikrCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMC41KSsKICBmYWNldF93cmFwKH5kZWdyb24sIHNjYWxlcyA9ICJmcmVlIikrCiAgdGhlbWVfcHVicigpCgpiaW5kX3Jvd3MobGlzdC5vZi5jZWxscykgJT4lIAogIGZpbHRlciggdHJlYXRtZW50ICE9ICJub25lIiwgcmVkID09ICJwdXAxLXJmcCIpICU+JSAKICBncm91cF9ieShjZWxsLmlkKSAlPiUgCiAgbXV0YXRlKEl0X0kwID0gZ2ZwTWVhbkJnQUZzdWIvZ2ZwTWVhbkJnQUZzdWJbMV0pICU+JSAKICBnZ3Bsb3QoLixhZXMoeCA9IGRlbHRhLnRpbWUvNjAsIHkgPSBnZnBNZWFuQmdBRnN1YiAsIGdyb3VwX2J5ID0gY2VsbC5pZCApKSsKICBnZW9tX2xpbmUoYWxwaGEgPSAwLjIpKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAuNSkrCiAgZmFjZXRfd3JhcCh+dHJlYXRtZW50LCBzY2FsZXMgPSAiZnJlZSIpKwogIHRoZW1lX3B1YnIoKQpgYGAKCgojcHJvZmlsZXMKYGBge3J9CiNmb3Igbm9uIHRyZWF0ZWQgY2VsbHMgYWxsIHRoZSB0aHJlZSBHRlBzCmJpbmRfcm93cyhsaXN0Lm9mLmNlbGxzKSAlPiUgCiAgZmlsdGVyKCB0cmVhdG1lbnQgJWluJSBjKCJub25lIiwiZG1zbzEiLCJkbXNvMiIpKSAlPiUgCiAgZ3JvdXBfYnkoY2VsbC5pZCkgJT4lIAogIG11dGF0ZShJdF9JMCA9IGdmcE1lYW5CZ0FGc3ViL2dmcE1lYW5CZ0FGc3ViWzFdKSAlPiUgCiAgZ2dwbG90KC4sYWVzKHggPSBkZWx0YS50aW1lLzYwLCB5ID0gSXRfSTAgLCBncm91cF9ieSA9IGNlbGwuaWQgLCBjb2xvciA9IHRyZWF0bWVudCkpKwogIGdlb21fbGluZShhbHBoYSA9IDAuMikrCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMC41KSsKICBmYWNldF9ncmlkKHJlZH5kZWdyb24sIHNjYWxlcyA9ICJmcmVlX3giKSsKICBzY2FsZV95X2xvZzEwKCkrCiAgdGhlbWVfcHVicigpCgojZm9yIG5vbiB0cmVhdGVkIChubyBETVNPIGNlbGxzKWNlbGxzIGFsbCB0aGUgdGhyZWUgR0ZQcwpiaW5kX3Jvd3MobGlzdC5vZi5jZWxscykgJT4lIAogIGZpbHRlciggdHJlYXRtZW50ID09ICJub25lIiwgcmVkID09ICJwdXAxLXJmcCIpICU+JSAKICBncm91cF9ieShjZWxsLmlkKSAlPiUgCiAgbXV0YXRlKEl0X0kwID0gZ2ZwTWVhbkJnQUZzdWIvZ2ZwTWVhbkJnQUZzdWJbMV0pICU+JSAKICBnZ3Bsb3QoLixhZXMoeCA9IGRlbHRhLnRpbWUvNjAsIHkgPSBJdF9JMCAsIGdyb3VwX2J5ID0gY2VsbC5pZCAsIGNvbG9yID0gcmVkKSkrCiAgZ2VvbV9saW5lKGFscGhhID0gMC4yKSsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLjUpKwogIGZhY2V0X3dyYXAofmRlZ3Jvbiwgc2NhbGVzID0gImZyZWVfeCIpKwogIHNjYWxlX3lfbG9nMTAoKSsKICB0aGVtZV9wdWJyKCkKCiNDTE4yCmJpbmRfcm93cyhsaXN0Lm9mLmNlbGxzKSAlPiUgCiAgZmlsdGVyKGRlZ3JvbiAlaW4lIGMoImNsbjIuMyIpLCB0cmVhdG1lbnQgPT0gIm5vbmUiLCByZWQgPT0gInB1cDEtcmZwIikgJT4lIAogIGdyb3VwX2J5KGNlbGwuaWQpICU+JSAKICBtdXRhdGUoSXRfSTAgPSBnZnBNZWFuQmdBRnN1Yi9nZnBNZWFuQmdBRnN1YlsxXSkgJT4lIAogIGdncGxvdCguLGFlcyh4ID0gZGVsdGEudGltZS82MCwgeSA9IGxvZyhJdF9JMCkgLCBncm91cF9ieSA9IGNlbGwuaWQpKSsKICBnZW9tX2xpbmUoYWxwaGEgPSAwLjIpKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAuNSkrCiAgZmFjZXRfZ3JpZChkZWdyb25+cmVkLCBzY2FsZXMgPSAiZnJlZV94IikrCiAgdGhlbWVfcHVicigpCgojbU9EQwpiaW5kX3Jvd3MobGlzdC5vZi5jZWxscykgJT4lIAogIGZpbHRlcihkZWdyb24gJWluJSBjKCJtT0RDLjIiKSwgdHJlYXRtZW50ID09ICJub25lIiwgcmVkID09ICJwdXAxLXJmcCIpICU+JSAKICBncm91cF9ieShjZWxsLmlkKSAlPiUgCiAgbXV0YXRlKEl0X0kwID0gZ2ZwTWVhbkJnQUZzdWIvZ2ZwTWVhbkJnQUZzdWJbMV0pICU+JSAKICBnZ3Bsb3QoLixhZXMoeCA9IGRlbHRhLnRpbWUvNjAsIHkgPSBsb2coSXRfSTApICwgZ3JvdXBfYnkgPSBjZWxsLmlkKSkrCiAgZ2VvbV9saW5lKGFscGhhID0gMC4yKSsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLjUpKwogIGZhY2V0X2dyaWQoZGVncm9ufnJlZCwgc2NhbGVzID0gImZyZWVfeCIpKwogIHRoZW1lX3B1YnIoKQoKI3N0YWJsZQpiaW5kX3Jvd3MobGlzdC5vZi5jZWxscykgJT4lIAogIGZpbHRlcihkZWdyb24gPT0gInN0YWJsZS4yIiwgdHJlYXRtZW50ID09ICJub25lIiwgcmVkID09ICJwdXAxLXJmcCIpICU+JSAKICBncm91cF9ieShjZWxsLmlkKSAlPiUgCiAgbXV0YXRlKEl0X0kwID0gZ2ZwTWVhbkJnQUZzdWIvZ2ZwTWVhbkJnQUZzdWJbMV0pICU+JSAKICBnZ3Bsb3QoLixhZXMoeCA9IGRlbHRhLnRpbWUvNjAsIHkgPSBJdF9JMCAsIGdyb3VwX2J5ID0gY2VsbC5pZCkpKwogIGdlb21fbGluZShhbHBoYSA9IDAuMikrCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMC41KSsKICBmYWNldF93cmFwKH5yZWQsIHNjYWxlcyA9ICJmcmVlX3giKSsKICBzY2FsZV95X2xvZzEwKCkrCiAgdGhlbWVfcHVicigpCgpiaW5kX3Jvd3MobGlzdC5vZi5jZWxscykgJT4lIAogIGZpbHRlcih0cmVhdG1lbnQgIT0gIm5vbmUiIHwgZGVncm9uICVpbiUgYygic3RhYmxlLjIiLCJzdGFibGUuMyIpKSAlPiUgCiAgZ3JvdXBfYnkoY2VsbC5pZCkgJT4lIAogIG11dGF0ZShJdF9JMCA9IGdmcE1lYW5CZ0FGc3ViL2dmcE1lYW5CZ0FGc3ViWzFdKSAlPiUgCiAgZ2dwbG90KC4sYWVzKHggPSBkZWx0YS50aW1lLzYwLCB5ID0gSXRfSTAgLCBncm91cF9ieSA9IGNlbGwuaWQpKSsKICBnZW9tX2xpbmUoYWxwaGEgPSAwLjIpKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAuNSkrCiAgZmFjZXRfd3JhcCh+dHJlYXRtZW50LCBzY2FsZXMgPSAiZnJlZV94IikrCiAgc2NhbGVfeV9sb2cxMCgpKwogIHRoZW1lX3B1YnIoKQpgYGAKCmBgYHtyfQojQ0xOMgpiaW5kX3Jvd3MobGlzdC5vZi5jZWxscykgJT4lIAogIGZpbHRlcihkZWdyb24gJWluJSBjKCJjbG4yIiwiY2xuMi4yIiwiY2xuMi4zIiksIHRyZWF0bWVudCA9PSAibm9uZSIsIGRlbHRhLnRpbWUgPT0gMCkgJT4lIAogIGdncGxvdCguLGFlcyh4ID0gZ2ZwTWVhbkJnQUZzdWIsIGZpbGwgPSBkZWdyb24pKSsKICBnZW9tX2RlbnNpdHkoYWVzKHkgPSAuLnNjYWxlZC4uKSwgYWxwaGEgPSAwLjIpKwogIGZhY2V0X3dyYXAofnJlZCwgc2NhbGVzID0gImZyZWVfeCIpKwogIHNjYWxlX3hfbG9nMTAoKSsKICB0aGVtZV9wdWJyKCkKCiNtT0RDCmJpbmRfcm93cyhsaXN0Lm9mLmNlbGxzKSAlPiUgCiAgZmlsdGVyKGRlZ3JvbiAlaW4lIGMoIm1PREMiLCJtT0RDLjIiLCJtT0RDLjMiKSwgdHJlYXRtZW50ID09ICJub25lIiwgZGVsdGEudGltZSA9PSAwKSAlPiUgCiAgIGdncGxvdCguLGFlcyh4ID0gZ2ZwTWVhbkJnQUZzdWIsIGZpbGwgPSBkZWdyb24pKSsKICBnZW9tX2RlbnNpdHkoYWVzKHkgPSAuLnNjYWxlZC4uKSwgYWxwaGEgPSAwLjIpKwogIGZhY2V0X3dyYXAofnJlZCwgc2NhbGVzID0gImZyZWVfeCIpKwogIHNjYWxlX3hfbG9nMTAoKSsKICB0aGVtZV9wdWJyKCkKYGBgCgpgYGB7cn0KYmluZF9yb3dzKGxpc3Qub2YuY2VsbHMpICU+JSAKICBmaWx0ZXIoaW1hZ2Uubm8gPT0gMSkgJT4lIAogIGdyb3VwX2J5KHRyZWF0bWVudCwgcmVkLCBkZWdyb24pICU+JSB0YWxseSgpCmBgYAoKCm1lY2hhbmlzdGljIG1vZGVscyB3aXRoIG1hdHVyYXRpb24sIGRlY2F5IGFuZCBmCgpgYGB7cn0KI3dpdGggMyBwYXJhbWV0ZXJzIChyYXRlIG9mIGRlY2F5LCByYXRlIG9mIG1hdHVyYXRpb24sIGZyYWMgb2YgdHJhbnNsYXRpb24gYWZ0ZXIgQ0hYIHRyZWF0bWVudCkKIG1lY2hhbmlzdGljLmZuPC0gZnVuY3Rpb24ocGFyLCBkZil7CiAgIGYgPC0gcGFyWzFdCiAgIGR5IDwtIHBhclsyXQogICBkbSA8LSBwYXJbM10KCiAgIGRmLm5ldyA8LSBkZiAgJT4lCiAgICAgbXV0YXRlKG1vZGVsID0gKChkeSAqICgxIC0gZikgKiBleHAoLWR5ICogZGVsdGEudGltZSkpIC8gZG0pICsgZXhwKC1keSAqIGRlbHRhLnRpbWUpICsKICAgICAgICAgICAgICAoMSAtIGV4cCgtZHkgKiBkZWx0YS50aW1lKSkgKiBmIC0KICAgICAgICAgICAgICAoKGR5ICogKDEgLSBmKSAqIGV4cCgtKGR5ICsgZG0pICogZGVsdGEudGltZSkpIC8gZG0pKSAlPiUKICAgICBtdXRhdGUoZXJyb3IgPSAoSTBfSXQgLSBtb2RlbCkgXiAyKSAlPiUKICAgICBzdW1tYXJpc2Uoc3VtLmVycm9yID0gc3VtKGVycm9yKSkKICAgIAogICAgcmV0dXJuKGRmLm5ldyRzdW0uZXJyb3IpCiAgfQoKI3R3byBwYXJhbWV0ZXIgbW9kZWwgKHJhdGUgb2YgZGVjYXksIGZyYWMgb2YgdHJhbnNsYXRpb24gYWZ0ZXIgQ0hYIHRyZWF0bWVudCkKIG1lY2hhbmlzdGljLmZuLm5vZG08LSBmdW5jdGlvbihwYXIsIGRmKXsKICAgZiA8LSBwYXJbMV0KICAgZHkgPC0gcGFyWzJdCgogICBkZi5uZXcgPC0gZGYgICU+JQogICAgIG11dGF0ZShtb2RlbCA9IGV4cCgtZHkgKiBkZWx0YS50aW1lKSArKDEgLSBleHAoLWR5ICogZGVsdGEudGltZSkpICogZiApICU+JQogICAgIG11dGF0ZShlcnJvciA9IChJMF9JdCAtIG1vZGVsKSBeIDIpICU+JQogICAgIHN1bW1hcmlzZShzdW0uZXJyb3IgPSBzdW0oZXJyb3IpKQogICAgCiAgICByZXR1cm4oZGYubmV3JHN1bS5lcnJvcikKIH0KIAojb25lIHBhcmFtZXRlciBtb2RlbCAocmF0ZSBvZiBkZWNheSwgZXhwb25lbnRpYWwgbW9kZWwpCiAgbWVjaGFuaXN0aWMuZm4uZXhwPC0gZnVuY3Rpb24ocGFyLCBkZil7CiAgIAogICBkeSA8LSBwYXJbMV0KCiAgIGRmLm5ldyA8LSBkZiAgJT4lCiAgICAgbXV0YXRlKG1vZGVsID0gZXhwKC1keSAqIGRlbHRhLnRpbWUpKSAlPiUKICAgICBtdXRhdGUoZXJyb3IgPSAoSTBfSXQgLSBtb2RlbCkgXiAyKSAlPiUKICAgICBzdW1tYXJpc2Uoc3VtLmVycm9yID0gc3VtKGVycm9yKSkKICAgIAogICAgcmV0dXJuKGRmLm5ldyRzdW0uZXJyb3IpCiAgfQogIAojdHdvIHBhcmFtZXRlciBtb2RlbCAocmF0ZSBvZiBtYXR1cmF0aW9uIGFuZCByYXRlIG9mIGRlY2F5KQogICAgbWVjaGFuaXN0aWMuZm4ud29mPC0gZnVuY3Rpb24ocGFyLCBkZil7CiAgCiAgIGR5IDwtIHBhclsxXQogICBkbSA8LSBwYXJbMl0KCiAgIGRmLm5ldyA8LSBkZiAgJT4lCiAgICAgbXV0YXRlKG1vZGVsID0gKChkeSAgKiBleHAoLWR5ICogZGVsdGEudGltZSkpIC8gZG0pICsgZXhwKC1keSAqIGRlbHRhLnRpbWUpICAtCiAgICAgICAgICAgICAgKChkeSAqIDEgKiBleHAoLShkeSArIGRtKSAqIGRlbHRhLnRpbWUpKSAvIGRtKSkgJT4lCiAgICAgbXV0YXRlKGVycm9yID0gKEkwX0l0IC0gbW9kZWwpIF4gMikgJT4lCiAgICAgc3VtbWFyaXNlKHN1bS5lcnJvciA9IHN1bShlcnJvcikpCiAgICAKICAgIHJldHVybihkZi5uZXckc3VtLmVycm9yKQogIH0KYGBgCgooZHkqKDEtZnJhYykqRVhQKC1keSpBMSkvZG0gKyBFWFAoLWR5KkExKSArICgxLUVYUCgtZHkqQTEpKSpmcmFjIC0gZHkqKDEtZnJhYykqRVhQKC0oZHkrZG0pKkExKS9kbSkKCmBgYHtyfQpsb2coMikvNiAjZm9yIHNmR0ZQIGluIHllYXN0IGdyb3d0aCBjb25kaXRpb25zIApgYGAKCmBgYHtyfQojZGVncm9uIEdGUFMKbGlzdC5vZi5jZWxscy4xIDwtIGJpbmRfcm93cyhsaXN0Lm9mLmNlbGxzKSAlPiUgI3RvIGFuYWx5emUgdGhlIG5ldyBleHBlcmltZW50cyBmcm9tIDctMjAtMjIgYW5kIDgtNC0yMgogIGZpbHRlcihkZWdyb24gJWluJSBjKCJtT0RDLjMiLCJjbG4yLjMiKSkgJT4lIAogIHNwbGl0KC4kY2VsbC5pZCkKCiNvbmx5IHN0YWJsZSBhbmQgNTB1TSB0cmVhdG1lbnQgY2VsbHMKbGlzdC5vZi5jZWxscy4yIDwtIGJpbmRfcm93cyhsaXN0Lm9mLmNlbGxzKSAlPiUgI3RvIGFuYWx5emUgdGhlIHN0YWJsZSBwdXAxLXJmcCBmcm9tIDctMjAtMjIKICBmaWx0ZXIoZGVncm9uICVpbiUgYygic3RhYmxlIiwgInN0YWJsZS4yIikgfAogICAgICAgICB0cmVhdG1lbnQgPT0gIjUwdU0iKSAlPiUgCiAgc3BsaXQoLiRjZWxsLmlkKQoKYGBgCgoxMC0xOC0yMgpgYGB7cn0KI2RlZ3JvbiBHRlBTCmxpc3Qub2YuY2VsbHMuMSA8LSBiaW5kX3Jvd3MobGlzdC5vZi5jZWxscykgJT4lICN0byBhbmFseXplIHRoZSBuZXcgZXhwZXJpbWVudHMgZnJvbSA3LTIwLTIyIGFuZCA4LTQtMjIKICBmaWx0ZXIoZGVncm9uID09ICJjbG4yLjQiKSAlPiUgCiAgc3BsaXQoLiRjZWxsLmlkKQoKI29ubHkgc3RhYmxlIGFuZCA1MHVNIHRyZWF0bWVudCBjZWxscwpsaXN0Lm9mLmNlbGxzLjIgPC0gYmluZF9yb3dzKGxpc3Qub2YuY2VsbHMpICU+JSAjdG8gYW5hbHl6ZSB0aGUgc3RhYmxlIHB1cDEtcmZwIGZyb20gNy0yMC0yMgogIGZpbHRlcihkZWdyb24gPT0gInN0YWJsZS4zIikgJT4lIAogIHNwbGl0KC4kY2VsbC5pZCkKYGBgCgojZXN0aW1hdGluZyBwYXJhbWV0ZXJzIApkeSwgZG0gLCBmCmBgYHtyfQojZm9yIHRoZSBkZWdyb24gR0ZQCgojMTAtMTgtMjIgZm9yIHRoZSByZXBlYXRlIG9mIGNsbjIgCnNpbmdsZS5jZWxsLmR5LmYuZG0gPC0gbWNsYXBwbHkobGlzdC5vZi5jZWxscy4xLCBmdW5jdGlvbihhKXsgCiAgIAogICBwYXIub3B0aW0gPC0gYygwLjUsIDAuMDUwMDUsIDAuMSkKICAgCiAgIG5hbWVzKHBhci5vcHRpbSkgPC0gYygiZiIsICJkeSIsICJkbSIpCiAgIAogICBkZiA8LSBhICU+JSAKICAgICAgICAgICAgbXV0YXRlKGltYWdlLm5vID0gaW1hZ2Uubm8tMSkgJT4lIAogICAgICAgICAgICBncm91cF9ieShjZWxsLmlkKSAlPiUgCiAgICAgICAgICAgIG11dGF0ZShJMF9JdCA9IGdmcE1lYW5CZ0FGc3ViL2dmcE1lYW5CZ0FGc3ViWzFdLAogICAgICAgICAgICAgICAgICAgZGVsdGEudGltZSA9IGRlbHRhLnRpbWUvNjApICU+JSAKICAgICB1bmdyb3VwKCkKICAgCiAgIG9wdGlteChwYXIgPSBwYXIub3B0aW0sIAogICAgICAgICAgZm4gPSBtZWNoYW5pc3RpYy5mbiAsIAogICAgICAgICAgbWV0aG9kID0gIkwtQkZHUy1CIiwgCiAgICAgICAgICBsb3dlciA9IGMoMCwgMC4wMDUsIDAuMDAwMDEpLCAjIGR5ID0gMC4wMDAwMSo2MCBmb3Igc3RhYmxlIEdGUAogICAgICAgICAgdXBwZXIgPSBjKDEsIDEsIEluZiksICNjaGFuZ2VkIGZyb20gZHkgPSA2IHRvIGR5ID0gMTAgYW5kIG5vdyB0byBkeSA9IDEKICAgICAgICAgIGRmID0gZGYsCiAgICAgICAgICBpdG5tYXggPSAxMDAwMDApCiAgIH0sIG1jLmNvcmVzID0gNDApCgoKYGBgCgoKCmBgYHtyfQojZm9yIHRoZSBzdGFibGUgR0ZQIGFuZCB0aGUgNTB1TSB0cmVhdG1lbnQKI2ZvciB0aGUgcmVwZWF0ZSBvZiAxMC03LTIyIApzaW5nbGUuY2VsbC5keS5mLmRtLjIgPC0gbWNsYXBwbHkobGlzdC5vZi5jZWxscy4yLCBmdW5jdGlvbihhKXsgCiAgIAogICBwYXIub3B0aW0gPC0gYygwLjUsIDAuMDA1MDA1LCAwLjEpCiAgIAogICBuYW1lcyhwYXIub3B0aW0pIDwtIGMoImYiLCAiZHkiLCAiZG0iKQogICAKICAgZGYgPC0gYSAlPiUgCiAgICAgICAgICAgIG11dGF0ZShpbWFnZS5ubyA9IGltYWdlLm5vLTEpICU+JSAKICAgICAgICAgICAgZ3JvdXBfYnkoY2VsbC5pZCkgJT4lIAogICAgICAgICAgICBtdXRhdGUoSTBfSXQgPSBnZnBNZWFuQmdBRnN1Yi9nZnBNZWFuQmdBRnN1YlsxXSwKICAgICAgICAgICAgICAgICAgIGRlbHRhLnRpbWUgPSBkZWx0YS50aW1lLzYwKSAlPiUgCiAgICAgdW5ncm91cCgpCiAgIAogICBvcHRpbXgocGFyID0gcGFyLm9wdGltLCAKICAgICAgICAgIGZuID0gbWVjaGFuaXN0aWMuZm4gLCAKICAgICAgICAgIG1ldGhvZCA9ICJMLUJGR1MtQiIsIAogICAgICAgICAgbG93ZXIgPSBjKDAsIDAuMDAwNSwgMC4wMDAwMSksICMgZHkgPSAwLjAwMDAxKjYwIGZvciBzdGFibGUgR0ZQCiAgICAgICAgICB1cHBlciA9IGMoMSwgMC4xLCBJbmYpLCAjY2hhbmdlIGR5ID0gMC4xIGZyb20gMTAsIHNpbWlsYXJseSBmb3IgYWxsIHRoZSBvdGhlciBvcHRpbWl6YXRpb25zIAogICAgICAgICAgZGYgPSBkZiwKICAgICAgICAgIGl0bm1heCA9IDEwMDAwMCkKICAgfSwgbWMuY29yZXMgPSA0MCkKCgpgYGAKCgpgYGB7cn0Kc2luZ2xlLmNlbGwuZHkuZi5kbS5kZiA8LSBzaW5nbGUuY2VsbC5keS5mLmRtICU+JSBiaW5kX3Jvd3MoLmlkID0gImNlbGwuaWQiKQpzaW5nbGUuY2VsbC5keS5mLmRtLmRmLjIgPC0gc2luZ2xlLmNlbGwuZHkuZi5kbS4yICU+JSBiaW5kX3Jvd3MoLmlkID0gImNlbGwuaWQiKQoKYGBgCgpgYGB7cn0KY29udmVyZ2VkLmNlbGxzIDwtIGJpbmRfcm93cyhzaW5nbGUuY2VsbC5keS5mLmRtLmRmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpbmdsZS5jZWxsLmR5LmYuZG0uZGYuMikgICU+JQogIGZpbHRlcihjb252Y29kZSA9PSAwKSAlPiUKICBtdXRhdGUoZGVncm9uID0gc3RyX3NwbGl0KGNlbGwuaWQsICJfIiwgc2ltcGxpZnkgPSBUKVssNF0sCiAgICAgICAgIHJlZCA9IHN0cl9zcGxpdChjZWxsLmlkLCAiXyIsIHNpbXBsaWZ5ID0gVClbLDVdLAogICAgICAgICB0cmVhdG1lbnQgPSBzdHJfc3BsaXQoY2VsbC5pZCwgIl8iLCBzaW1wbGlmeSA9IFQpWyw2XSkKCiMgY29udmVyZ2VkLmNlbGxzIDwtIHNpbmdsZS5jZWxsLmR5LmYuZG0uZGYuMiAgJT4lIAojICAgZmlsdGVyKGNvbnZjb2RlID09IDApICU+JSAKIyAgIG11dGF0ZShkZWdyb24gPSBzdHJfc3BsaXQoY2VsbC5pZCwgIl8iLCBzaW1wbGlmeSA9IFQpWyw0XSwgCiMgICAgICAgICAgcmVkID0gc3RyX3NwbGl0KGNlbGwuaWQsICJfIiwgc2ltcGxpZnkgPSBUKVssNV0sCiMgICAgICAgICAgdHJlYXRtZW50ID0gc3RyX3NwbGl0KGNlbGwuaWQsICJfIiwgc2ltcGxpZnkgPSBUKVssNl0pCmBgYAoKYGBge3J9CiMgY29udmVyZ2VkLmNlbGxzLm9sZCA8LSBzaW5nbGUuY2VsbC5keS5mLmRtLmRmICAlPiUgCiMgICBmaWx0ZXIoY29udmNvZGUgPT0gMCkgJT4lIAojICAgbXV0YXRlKGRlZ3JvbiA9IHN0cl9zcGxpdChjZWxsLmlkLCAiXyIsIHNpbXBsaWZ5ID0gVClbLDRdLCAKIyAgICAgICAgICByZWQgPSBzdHJfc3BsaXQoY2VsbC5pZCwgIl8iLCBzaW1wbGlmeSA9IFQpWyw1XSwKIyAgICAgICAgICB0cmVhdG1lbnQgPSBzdHJfc3BsaXQoY2VsbC5pZCwgIl8iLCBzaW1wbGlmeSA9IFQpWyw2XSkKYGBgCgpwbG90cwpgYGB7cn0KI2RpcyBvZiBmCmNvbnZlcmdlZC5jZWxscyAlPiUgCiAgZ2dwbG90KC4sYWVzKHggPSBmLCBjb2xvciA9IHRyZWF0bWVudCkpKwogIGdlb21fZGVuc2l0eShhZXMoeSA9IC4uc2NhbGVkLi4pKSsKICBmYWNldF9ncmlkKHJlZH5kZWdyb24pCgojZG0KY29udmVyZ2VkLmNlbGxzICU+JSAKICBnZ3Bsb3QoLixhZXMoeCA9IGRtLCBjb2xvciA9IHRyZWF0bWVudCkpKwogIGdlb21fZGVuc2l0eShhZXMoeSA9IC4uc2NhbGVkLi4pKSsKICBmYWNldF9ncmlkKHJlZH5kZWdyb24pKwogIHNjYWxlX3hfbG9nMTAoKQoKI2R5CmNvbnZlcmdlZC5jZWxscyAlPiUgCiAgZ2dwbG90KC4sYWVzKHggPSBkeSwgY29sb3IgPSB0cmVhdG1lbnQpKSsKICBnZW9tX2RlbnNpdHkoYWVzKHkgPSAuLnNjYWxlZC4uKSkrCiAgZmFjZXRfZ3JpZChyZWR+ZGVncm9uKSsKICBzY2FsZV94X2xvZzEwKCkKI2R5CiMgY29udmVyZ2VkLmNlbGxzLm9sZCAlPiUgCiMgICBnZ3Bsb3QoLixhZXMoeCA9IGR5LCBjb2xvciA9IHRyZWF0bWVudCkpKwojICAgZ2VvbV9kZW5zaXR5KGFlcyh5ID0gLi5zY2FsZWQuLikpKwojICAgZmFjZXRfZ3JpZChyZWR+ZGVncm9uKSsKIyAgIHNjYWxlX3hfbG9nMTAoKQoKI2hhbGYgbGl2ZXMKY29udmVyZ2VkLmNlbGxzICU+JSAKICBnZ3Bsb3QoLixhZXMoeCA9IGxvZygyKS9keSwgY29sb3IgPSB0cmVhdG1lbnQpKSsKICBnZW9tX2RlbnNpdHkoYWVzKHkgPSAuLnNjYWxlZC4uKSkrCiAgZmFjZXRfZ3JpZChyZWR+ZGVncm9uKQoKI21hdHVyYXRpb24gdGltZXMKY29udmVyZ2VkLmNlbGxzICU+JSAKICBmaWx0ZXIodHJlYXRtZW50ID09ICJub25lIikgJT4lIAogIGdncGxvdCguLGFlcyh4ID0gbG9nKDIpL2RtLCBjb2xvciA9IHRyZWF0bWVudCkpKwogIGdlb21fZGVuc2l0eShhZXMoeSA9IC4uc2NhbGVkLi4pKSsKICBmYWNldF9ncmlkKHJlZH5kZWdyb24pKwogIHNjYWxlX3hfbG9nMTAoKQoKI1JTUwpjb252ZXJnZWQuY2VsbHMgJT4lIAogIGdncGxvdCguLGFlcyh4ID0gdmFsdWUsIGNvbG9yID0gdHJlYXRtZW50KSkrCiAgZ2VvbV9kZW5zaXR5KGFlcyh5ID0gLi5zY2FsZWQuLikpKwogIGZhY2V0X2dyaWQocmVkfmRlZ3JvbikrCiAgc2NhbGVfeF9sb2cxMCgpCmBgYAoKQXZlcmFnZSB2YWx1ZXMgb2YgdGhlIHBhcmFtZXRlcnMKYGBge3J9CmNvbnZlcmdlZC5jZWxscyAlPiUgCiAgZ3JvdXBfYnkodHJlYXRtZW50LCByZWQsIGRlZ3JvbikgJT4lIAogIHN1bW1hcmlzZShkbS5hdmcgPSBtZWFuKGRtKSkKCmNvbnZlcmdlZC5jZWxscyAlPiUgCiAgZ3JvdXBfYnkodHJlYXRtZW50LCByZWQsIGRlZ3JvbikgJT4lIAogIHN1bW1hcmlzZShmLmF2ZyA9IG1lYW4oZiksCiAgICAgICAgICAgIGR5LmF2ZyA9IG1lYW4oZHkpKQpgYGAKCiN3aXRob3V0IGRtIGp1c3QgZHkgYW5kIGYKYGBge3J9CiNmb3IgdGhlIGRlZ3JvbiBHRlAKc2luZ2xlLmNlbGwuZHkuZi4xIDwtIG1jbGFwcGx5KGxpc3Qub2YuY2VsbHMuMSwgZnVuY3Rpb24oYSl7IAogICAKICAgcGFyLm9wdGltIDwtIGMoMC41LCAwLjA1MDA1KQogICAKICAgbmFtZXMocGFyLm9wdGltKSA8LSBjKCJmIiwgImR5IikKICAgCiAgIGRmIDwtIGEgJT4lIAogICAgICAgICAgICBtdXRhdGUoaW1hZ2Uubm8gPSBpbWFnZS5uby0xKSAlPiUgCiAgICAgICAgICAgIGdyb3VwX2J5KGNlbGwuaWQpICU+JSAKICAgICAgICAgICAgbXV0YXRlKEkwX0l0ID0gZ2ZwTWVhbkJnQUZzdWIvZ2ZwTWVhbkJnQUZzdWJbMV0sCiAgICAgICAgICAgICAgICAgICBkZWx0YS50aW1lID0gZGVsdGEudGltZS82MCkgJT4lIAogICAgIHVuZ3JvdXAoKQogICAKICAgb3B0aW14KHBhciA9IHBhci5vcHRpbSwgI3VwZGF0ZWQgdGhpcyBsaW5lIHRvIG1hdGNoIHRoZSBpbml0aWFsIGRiIHdpdGggZXhwLmZpZWxkIHdoZW4gSSBhbSBvcHRpbWl6aW5nIGluIGEgbG9vcAogICAgICAgICAgZm4gPSBtZWNoYW5pc3RpYy5mbi5ub2RtICwgCiAgICAgICAgICBtZXRob2QgPSAiTC1CRkdTLUIiLCAKICAgICAgICAgIGxvd2VyID0gYygwLCAwLjAwNSksIAogICAgICAgICAgdXBwZXIgPSBjKDEsIDEpLCAKICAgICAgICAgIGRmID0gZGYsCiAgICAgICAgICBpdG5tYXggPSAxMDAwMDApCiAgIH0sIG1jLmNvcmVzID0gNDApCgojZm9yIHRoZSBzdGFibGUgR0ZQIGFuZCB0aGUgNTB1TSB0cmVhdG1lbnQgCnNpbmdsZS5jZWxsLmR5LmYuMjwtIG1jbGFwcGx5KGxpc3Qub2YuY2VsbHMuMiwgZnVuY3Rpb24oYSl7IAogICAKICAgcGFyLm9wdGltIDwtIGMoMC41LCAwLjAwNTAwNSkKICAgCiAgIG5hbWVzKHBhci5vcHRpbSkgPC0gYygiZiIsICJkeSIpCiAgIAogICBkZiA8LSBhICU+JSAKICAgICAgICAgICAgbXV0YXRlKGltYWdlLm5vID0gaW1hZ2Uubm8tMSkgJT4lIAogICAgICAgICAgICBncm91cF9ieShjZWxsLmlkKSAlPiUgCiAgICAgICAgICAgIG11dGF0ZShJMF9JdCA9IGdmcE1lYW5CZ0FGc3ViL2dmcE1lYW5CZ0FGc3ViWzFdLAogICAgICAgICAgICAgICAgICAgZGVsdGEudGltZSA9IGRlbHRhLnRpbWUvNjApICU+JSAKICAgICB1bmdyb3VwKCkKICAgCiAgIG9wdGlteChwYXIgPSBwYXIub3B0aW0sICN1cGRhdGVkIHRoaXMgbGluZSB0byBtYXRjaCB0aGUgaW5pdGlhbCBkYiB3aXRoIGV4cC5maWVsZCB3aGVuIEkgYW0gb3B0aW1pemluZyBpbiBhIGxvb3AKICAgICAgICAgIGZuID0gbWVjaGFuaXN0aWMuZm4ubm9kbSAsIAogICAgICAgICAgbWV0aG9kID0gIkwtQkZHUy1CIiwgCiAgICAgICAgICBsb3dlciA9IGMoMCwgMC4wMDA1KSwgCiAgICAgICAgICB1cHBlciA9IGMoMSwgMC4xKSwgCiAgICAgICAgICBkZiA9IGRmLAogICAgICAgICAgaXRubWF4ID0gMTAwMDAwKQogICB9LCBtYy5jb3JlcyA9IDQwKQoKCmBgYAoKYGBge3J9CnNpbmdsZS5jZWxsLmR5LmYuZGYuMSA8LSBzaW5nbGUuY2VsbC5keS5mLjEgJT4lIAogIGJpbmRfcm93cyguaWQgPSAiY2VsbC5pZCIpCgpzaW5nbGUuY2VsbC5keS5mLmRmLjIgPC0gc2luZ2xlLmNlbGwuZHkuZi4yICU+JSAKICBiaW5kX3Jvd3MoLmlkID0gImNlbGwuaWQiKQpgYGAKCmBgYHtyfQpjb252ZXJnZWQuY2VsbHMuMiA8LSBiaW5kX3Jvd3Moc2luZ2xlLmNlbGwuZHkuZi5kZi4xLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2luZ2xlLmNlbGwuZHkuZi5kZi4yKSAlPiUKICBmaWx0ZXIoY29udmNvZGUgPT0gMCkgJT4lCiAgbXV0YXRlKGRlZ3JvbiA9IHN0cl9zcGxpdChjZWxsLmlkLCAiXyIsIHNpbXBsaWZ5ID0gVClbLDRdLAogICAgICAgICByZWQgPSBzdHJfc3BsaXQoY2VsbC5pZCwgIl8iLCBzaW1wbGlmeSA9IFQpWyw1XSwKICAgICAgICAgdHJlYXRtZW50ID0gc3RyX3NwbGl0KGNlbGwuaWQsICJfIiwgc2ltcGxpZnkgPSBUKVssNl0pCgojIGNvbnZlcmdlZC5jZWxscy4yIDwtIHNpbmdsZS5jZWxsLmR5LmYuZGYuMiAlPiUgCiMgICBmaWx0ZXIoY29udmNvZGUgPT0gMCkgJT4lIAojICAgbXV0YXRlKGRlZ3JvbiA9IHN0cl9zcGxpdChjZWxsLmlkLCAiXyIsIHNpbXBsaWZ5ID0gVClbLDRdLCAKIyAgICAgICAgICByZWQgPSBzdHJfc3BsaXQoY2VsbC5pZCwgIl8iLCBzaW1wbGlmeSA9IFQpWyw1XSwKIyAgICAgICAgICB0cmVhdG1lbnQgPSBzdHJfc3BsaXQoY2VsbC5pZCwgIl8iLCBzaW1wbGlmeSA9IFQpWyw2XSkKCgoKIyAKIyBjb252ZXJnZWQuY2VsbHMuMi5vbGQgPC0gc2luZ2xlLmNlbGwuZHkuZi5kZiAlPiUgCiMgICBmaWx0ZXIoY29udmNvZGUgPT0gMCkgJT4lIAojICAgbXV0YXRlKGRlZ3JvbiA9IHN0cl9zcGxpdChjZWxsLmlkLCAiXyIsIHNpbXBsaWZ5ID0gVClbLDRdLCAKIyAgICAgICAgICByZWQgPSBzdHJfc3BsaXQoY2VsbC5pZCwgIl8iLCBzaW1wbGlmeSA9IFQpWyw1XSwKIyAgICAgICAgICB0cmVhdG1lbnQgPSBzdHJfc3BsaXQoY2VsbC5pZCwgIl8iLCBzaW1wbGlmeSA9IFQpWyw2XSkKYGBgCgpwbG90cwpgYGB7cn0KI2YKY29udmVyZ2VkLmNlbGxzLjIgJT4lIAogIGdncGxvdCguLGFlcyh4ID0gZiwgY29sb3IgPSB0cmVhdG1lbnQpKSsKICBnZW9tX2RlbnNpdHkoYWVzKHkgPSAuLnNjYWxlZC4uKSkrCiAgZmFjZXRfZ3JpZChyZWR+ZGVncm9uKQoKY29udmVyZ2VkLmNlbGxzLjIub2xkICU+JSAKICBnZ3Bsb3QoLixhZXMoeCA9IGYsIGNvbG9yID0gdHJlYXRtZW50KSkrCiAgZ2VvbV9kZW5zaXR5KGFlcyh5ID0gLi5zY2FsZWQuLikpKwogIGZhY2V0X2dyaWQocmVkfmRlZ3JvbikKCiNkeQpjb252ZXJnZWQuY2VsbHMuMiAlPiUgCiAgZ2dwbG90KC4sYWVzKHggPSBkeSwgY29sb3IgPSB0cmVhdG1lbnQpKSsKICBnZW9tX2RlbnNpdHkoYWVzKHkgPSAuLnNjYWxlZC4uKSkrCiAgZmFjZXRfZ3JpZChyZWR+ZGVncm9uKSsKICBzY2FsZV94X2xvZzEwKCkKI2R5CmNvbnZlcmdlZC5jZWxscy4yLm9sZCAlPiUgCiAgZ2dwbG90KC4sYWVzKHggPSBkeSwgY29sb3IgPSB0cmVhdG1lbnQpKSsKICBnZW9tX2RlbnNpdHkoYWVzKHkgPSAuLnNjYWxlZC4uKSkrCiAgZmFjZXRfZ3JpZChyZWR+ZGVncm9uKSsKICBzY2FsZV94X2xvZzEwKCkKCiNoYWxmIGxpdmVzCmNvbnZlcmdlZC5jZWxscy4yICU+JSAKICBnZ3Bsb3QoLixhZXMoeCA9IGxvZygyKS9keSwgY29sb3IgPSB0cmVhdG1lbnQpKSsKICBnZW9tX2RlbnNpdHkoYWVzKHkgPSAuLnNjYWxlZC4uKSkrCiAgZmFjZXRfZ3JpZChyZWR+ZGVncm9uKQoKI3Jzcwpjb252ZXJnZWQuY2VsbHMuMiAlPiUgCiAgZ2dwbG90KC4sYWVzKHggPSB2YWx1ZSwgY29sb3IgPSB0cmVhdG1lbnQpKSsKICBnZW9tX2RlbnNpdHkoYWVzKHkgPSAuLnNjYWxlZC4uKSkrCiAgZmFjZXRfZ3JpZChyZWR+ZGVncm9uKSsKICBzY2FsZV94X2xvZzEwKCkKYGBgCgojZXhwb25lbnRpYWwKYGBge3J9CiNmb3IgZGVncm9uIEdGUHMKc2luZ2xlLmNlbGwuZHkuMTwtIG1jbGFwcGx5KGxpc3Qub2YuY2VsbHMuMSwgZnVuY3Rpb24oYSl7IAogICAKICAgcGFyLm9wdGltIDwtIGMoMC4wNTAwNSkKICAgCiAgIG5hbWVzKHBhci5vcHRpbSkgPC0gYygiZHkiKQogICAKICAgZGYgPC0gYSAlPiUgCiAgICAgICAgICAgIG11dGF0ZShpbWFnZS5ubyA9IGltYWdlLm5vLTEpICU+JSAKICAgICAgICAgICAgZ3JvdXBfYnkoY2VsbC5pZCkgJT4lIAogICAgICAgICAgICBtdXRhdGUoSTBfSXQgPSBnZnBNZWFuQmdBRnN1Yi9nZnBNZWFuQmdBRnN1YlsxXSwKICAgICAgICAgICAgICAgICAgIGRlbHRhLnRpbWUgPSBkZWx0YS50aW1lLzYwKSAlPiUgCiAgICAgdW5ncm91cCgpCiAgIAogICBvcHRpbXgocGFyID0gcGFyLm9wdGltLCAjdXBkYXRlZCB0aGlzIGxpbmUgdG8gbWF0Y2ggdGhlIGluaXRpYWwgZGIgd2l0aCBleHAuZmllbGQgd2hlbiBJIGFtIG9wdGltaXppbmcgaW4gYSBsb29wCiAgICAgICAgICBmbiA9IG1lY2hhbmlzdGljLmZuLmV4cCAsIAogICAgICAgICAgbWV0aG9kID0gIkwtQkZHUy1CIiwgCiAgICAgICAgICBsb3dlciA9IGMoMC4wMDUpLCAKICAgICAgICAgIHVwcGVyID0gYygxKSwgCiAgICAgICAgICBkZiA9IGRmLAogICAgICAgICAgaXRubWF4ID0gMTAwMDAwKQogICB9LCBtYy5jb3JlcyA9IDQwKQoKI2ZvciBzdGFibGUgZ2ZwIGFuZCA1MHVNIApzaW5nbGUuY2VsbC5keS4yIDwtIG1jbGFwcGx5KGxpc3Qub2YuY2VsbHMuMiwgZnVuY3Rpb24oYSl7IAogICAKICAgcGFyLm9wdGltIDwtIGMoMC4wMDUwMDUpCiAgIAogICBuYW1lcyhwYXIub3B0aW0pIDwtIGMoImR5IikKICAgCiAgIGRmIDwtIGEgJT4lIAogICAgICAgICAgICBtdXRhdGUoaW1hZ2Uubm8gPSBpbWFnZS5uby0xKSAlPiUgCiAgICAgICAgICAgIGdyb3VwX2J5KGNlbGwuaWQpICU+JSAKICAgICAgICAgICAgbXV0YXRlKEkwX0l0ID0gZ2ZwTWVhbkJnQUZzdWIvZ2ZwTWVhbkJnQUZzdWJbMV0sCiAgICAgICAgICAgICAgICAgICBkZWx0YS50aW1lID0gZGVsdGEudGltZS82MCkgJT4lIAogICAgIHVuZ3JvdXAoKQogICAKICAgb3B0aW14KHBhciA9IHBhci5vcHRpbSwgI3VwZGF0ZWQgdGhpcyBsaW5lIHRvIG1hdGNoIHRoZSBpbml0aWFsIGRiIHdpdGggZXhwLmZpZWxkIHdoZW4gSSBhbSBvcHRpbWl6aW5nIGluIGEgbG9vcAogICAgICAgICAgZm4gPSBtZWNoYW5pc3RpYy5mbi5leHAgLCAKICAgICAgICAgIG1ldGhvZCA9ICJMLUJGR1MtQiIsIAogICAgICAgICAgbG93ZXIgPSBjKDAuMDAwNSksIAogICAgICAgICAgdXBwZXIgPSBjKDAuMSksIAogICAgICAgICAgZGYgPSBkZiwKICAgICAgICAgIGl0bm1heCA9IDEwMDAwMCkKICAgfSwgbWMuY29yZXMgPSA0MCkKCgpgYGAKCmBgYHtyfQpzaW5nbGUuY2VsbC5keS5kZi4xIDwtIHNpbmdsZS5jZWxsLmR5LjEgJT4lIAogIGJpbmRfcm93cyguaWQgPSAiY2VsbC5pZCIpCgpzaW5nbGUuY2VsbC5keS5kZi4yIDwtIHNpbmdsZS5jZWxsLmR5LjIgJT4lIAogIGJpbmRfcm93cyguaWQgPSAiY2VsbC5pZCIpCmBgYAoKCmBgYHtyfQpjb252ZXJnZWQuY2VsbHMuMyA8LSBiaW5kX3Jvd3Moc2luZ2xlLmNlbGwuZHkuZGYuMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpbmdsZS5jZWxsLmR5LmRmLjIpICU+JQogIGZpbHRlcihjb252Y29kZSA9PSAwKSAlPiUKICBtdXRhdGUoZGVncm9uID0gc3RyX3NwbGl0KGNlbGwuaWQsICJfIiwgc2ltcGxpZnkgPSBUKVssNF0sCiAgICAgICAgIHJlZCA9IHN0cl9zcGxpdChjZWxsLmlkLCAiXyIsIHNpbXBsaWZ5ID0gVClbLDVdLAogICAgICAgICB0cmVhdG1lbnQgPSBzdHJfc3BsaXQoY2VsbC5pZCwgIl8iLCBzaW1wbGlmeSA9IFQpWyw2XSkKCiMgY29udmVyZ2VkLmNlbGxzLjMgPC0gc2luZ2xlLmNlbGwuZHkuZGYuMiAlPiUgCiMgICBmaWx0ZXIoY29udmNvZGUgPT0gMCkgJT4lIAojICAgbXV0YXRlKGRlZ3JvbiA9IHN0cl9zcGxpdChjZWxsLmlkLCAiXyIsIHNpbXBsaWZ5ID0gVClbLDRdLCAKIyAgICAgICAgICByZWQgPSBzdHJfc3BsaXQoY2VsbC5pZCwgIl8iLCBzaW1wbGlmeSA9IFQpWyw1XSwKIyAgICAgICAgICB0cmVhdG1lbnQgPSBzdHJfc3BsaXQoY2VsbC5pZCwgIl8iLCBzaW1wbGlmeSA9IFQpWyw2XSkKIyAKIyBjb252ZXJnZWQuY2VsbHMuMy5vbGQgPC0gc2luZ2xlLmNlbGwuZHkuZGYgJT4lIAojICAgZmlsdGVyKGNvbnZjb2RlID09IDApICU+JSAKIyAgIG11dGF0ZShkZWdyb24gPSBzdHJfc3BsaXQoY2VsbC5pZCwgIl8iLCBzaW1wbGlmeSA9IFQpWyw0XSwgCiMgICAgICAgICAgcmVkID0gc3RyX3NwbGl0KGNlbGwuaWQsICJfIiwgc2ltcGxpZnkgPSBUKVssNV0sCiMgICAgICAgICAgdHJlYXRtZW50ID0gc3RyX3NwbGl0KGNlbGwuaWQsICJfIiwgc2ltcGxpZnkgPSBUKVssNl0pCgpgYGAKCnBsb3RzCmBgYHtyfQojZHkKY29udmVyZ2VkLmNlbGxzLjMgJT4lIAogIGdncGxvdCguLGFlcyh4ID0gZHksIGNvbG9yID0gdHJlYXRtZW50KSkrCiAgZ2VvbV9kZW5zaXR5KGFlcyh5ID0gLi5zY2FsZWQuLikpKwogIGZhY2V0X2dyaWQocmVkfmRlZ3JvbikrCiAgc2NhbGVfeF9sb2cxMCgpICsKICB0aGVtZShheGlzLnRleHQueCAgPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSkpCgpjb252ZXJnZWQuY2VsbHMuMy5vbGQgJT4lIAogIGdncGxvdCguLGFlcyh4ID0gZHksIGNvbG9yID0gdHJlYXRtZW50KSkrCiAgZ2VvbV9kZW5zaXR5KGFlcyh5ID0gLi5zY2FsZWQuLikpKwogIGZhY2V0X2dyaWQocmVkfmRlZ3JvbikrCiAgc2NhbGVfeF9sb2cxMCgpKwogIHRoZW1lKGF4aXMudGV4dC54ICA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1KSkKCiNoYWxmIGxpdmVzCmNvbnZlcmdlZC5jZWxscy4zICU+JSAKICBnZ3Bsb3QoLixhZXMoeCA9IGxvZygyKS9keSwgY29sb3IgPSB0cmVhdG1lbnQpKSsKICBnZW9tX2RlbnNpdHkoYWVzKHkgPSAuLnNjYWxlZC4uKSkrCiAgZmFjZXRfZ3JpZChyZWR+ZGVncm9uKQoKI3Jzcwpjb252ZXJnZWQuY2VsbHMuMyAlPiUgCiAgZ2dwbG90KC4sYWVzKHggPSB2YWx1ZSwgY29sb3IgPSB0cmVhdG1lbnQpKSsKICBnZW9tX2RlbnNpdHkoYWVzKHkgPSAuLnNjYWxlZC4uKSkrCiAgZmFjZXRfZ3JpZChyZWR+ZGVncm9uKSsKICBzY2FsZV94X2xvZzEwKCkKYGBgCgojd2l0aG91dCBmCmp1c3QgZG0gYW5kIGR5CmBgYHtyfQpzaW5nbGUuY2VsbC5keS5kbS4xIDwtIG1jbGFwcGx5KGxpc3Qub2YuY2VsbHMuMSwgZnVuY3Rpb24oYSl7IAogICAKICAgcGFyLm9wdGltIDwtIGMoMC4wNTAwNSwgMC4xKQogICAKICAgbmFtZXMocGFyLm9wdGltKSA8LSBjKCJkeSIsICJkbSIpCiAgIAogICBkZiA8LSBhICU+JSAKICAgICAgICAgICAgbXV0YXRlKGltYWdlLm5vID0gaW1hZ2Uubm8tMSkgJT4lIAogICAgICAgICAgICBncm91cF9ieShjZWxsLmlkKSAlPiUgCiAgICAgICAgICAgIG11dGF0ZShJMF9JdCA9IGdmcE1lYW5CZ0FGc3ViL2dmcE1lYW5CZ0FGc3ViWzFdLAogICAgICAgICAgICAgICAgICAgZGVsdGEudGltZSA9IGRlbHRhLnRpbWUvNjApICU+JSAKICAgICB1bmdyb3VwKCkKICAgCiAgIG9wdGlteChwYXIgPSBwYXIub3B0aW0sICN1cGRhdGVkIHRoaXMgbGluZSB0byBtYXRjaCB0aGUgaW5pdGlhbCBkYiB3aXRoIGV4cC5maWVsZCB3aGVuIEkgYW0gb3B0aW1pemluZyBpbiBhIGxvb3AKICAgICAgICAgIGZuID0gbWVjaGFuaXN0aWMuZm4ud29mLCAKICAgICAgICAgIG1ldGhvZCA9ICJMLUJGR1MtQiIsIAogICAgICAgICAgbG93ZXIgPSBjKCAwLjAwNSwgMC4wMDAwMSksIAogICAgICAgICAgdXBwZXIgPSBjKCAxLCBJbmYpLCAKICAgICAgICAgIGRmID0gZGYsCiAgICAgICAgICBpdG5tYXggPSAxMDAwMDApCiAgIH0sIG1jLmNvcmVzID0gNDApCgojc3RhYmxlIGdmcApzaW5nbGUuY2VsbC5keS5kbS4yIDwtIG1jbGFwcGx5KGxpc3Qub2YuY2VsbHMuMiwgZnVuY3Rpb24oYSl7IAogICAKICAgcGFyLm9wdGltIDwtIGMoMC4wMDUsIDAuMSkKICAgCiAgIG5hbWVzKHBhci5vcHRpbSkgPC0gYygiZHkiLCAiZG0iKQogICAKICAgZGYgPC0gYSAlPiUgCiAgICAgICAgICAgIG11dGF0ZShpbWFnZS5ubyA9IGltYWdlLm5vLTEpICU+JSAKICAgICAgICAgICAgZ3JvdXBfYnkoY2VsbC5pZCkgJT4lIAogICAgICAgICAgICBtdXRhdGUoSTBfSXQgPSBnZnBNZWFuQmdBRnN1Yi9nZnBNZWFuQmdBRnN1YlsxXSwKICAgICAgICAgICAgICAgICAgIGRlbHRhLnRpbWUgPSBkZWx0YS50aW1lLzYwKSAlPiUgCiAgICAgdW5ncm91cCgpCiAgIAogICBvcHRpbXgocGFyID0gcGFyLm9wdGltLCAjdXBkYXRlZCB0aGlzIGxpbmUgdG8gbWF0Y2ggdGhlIGluaXRpYWwgZGIgd2l0aCBleHAuZmllbGQgd2hlbiBJIGFtIG9wdGltaXppbmcgaW4gYSBsb29wCiAgICAgICAgICBmbiA9IG1lY2hhbmlzdGljLmZuLndvZiwgCiAgICAgICAgICBtZXRob2QgPSAiTC1CRkdTLUIiLCAKICAgICAgICAgIGxvd2VyID0gYyggMC4wMDA1LCAwLjAwMDAxKSwgCiAgICAgICAgICB1cHBlciA9IGMoIDAuMSwgSW5mKSwgCiAgICAgICAgICBkZiA9IGRmLAogICAgICAgICAgaXRubWF4ID0gMTAwMDAwKQogICB9LCBtYy5jb3JlcyA9IDQwKQoKCmBgYAoKYGBge3J9CnNpbmdsZS5jZWxsLmR5LmRtLmRmLjEgPC0gc2luZ2xlLmNlbGwuZHkuZG0uMSAlPiUgYmluZF9yb3dzKC5pZCA9ICJjZWxsLmlkIikKc2luZ2xlLmNlbGwuZHkuZG0uZGYuMiA8LSBzaW5nbGUuY2VsbC5keS5kbS4yICU+JSBiaW5kX3Jvd3MoLmlkID0gImNlbGwuaWQiKQpgYGAKCmBgYHtyfQojIGNvbnZlcmdlZC5jZWxscy40Lm9sZCA8LSBzaW5nbGUuY2VsbC5keS5kbS5kZiAlPiUgCiMgICBmaWx0ZXIoY29udmNvZGUgPT0gMCkgJT4lIAojICAgbXV0YXRlKGRlZ3JvbiA9IHN0cl9zcGxpdChjZWxsLmlkLCAiXyIsIHNpbXBsaWZ5ID0gVClbLDRdLCAKIyAgICAgICAgICByZWQgPSBzdHJfc3BsaXQoY2VsbC5pZCwgIl8iLCBzaW1wbGlmeSA9IFQpWyw1XSwKIyAgICAgICAgICB0cmVhdG1lbnQgPSBzdHJfc3BsaXQoY2VsbC5pZCwgIl8iLCBzaW1wbGlmeSA9IFQpWyw2XSkKCmNvbnZlcmdlZC5jZWxscy40IDwtIGJpbmRfcm93cyhzaW5nbGUuY2VsbC5keS5kbS5kZi4xLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2luZ2xlLmNlbGwuZHkuZG0uZGYuMikgJT4lCiAgZmlsdGVyKGNvbnZjb2RlID09IDApICU+JQogIG11dGF0ZShkZWdyb24gPSBzdHJfc3BsaXQoY2VsbC5pZCwgIl8iLCBzaW1wbGlmeSA9IFQpWyw0XSwKICAgICAgICAgcmVkID0gc3RyX3NwbGl0KGNlbGwuaWQsICJfIiwgc2ltcGxpZnkgPSBUKVssNV0sCiAgICAgICAgIHRyZWF0bWVudCA9IHN0cl9zcGxpdChjZWxsLmlkLCAiXyIsIHNpbXBsaWZ5ID0gVClbLDZdKQoKCiMgY29udmVyZ2VkLmNlbGxzLjQgPC0gc2luZ2xlLmNlbGwuZHkuZG0uZGYuMiAlPiUgCiMgICBmaWx0ZXIoY29udmNvZGUgPT0gMCkgJT4lIAojICAgbXV0YXRlKGRlZ3JvbiA9IHN0cl9zcGxpdChjZWxsLmlkLCAiXyIsIHNpbXBsaWZ5ID0gVClbLDRdLCAKIyAgICAgICAgICByZWQgPSBzdHJfc3BsaXQoY2VsbC5pZCwgIl8iLCBzaW1wbGlmeSA9IFQpWyw1XSwKIyAgICAgICAgICB0cmVhdG1lbnQgPSBzdHJfc3BsaXQoY2VsbC5pZCwgIl8iLCBzaW1wbGlmeSA9IFQpWyw2XSkKCgpgYGAKCnBsb3RzCmBgYHtyfQojZHkKY29udmVyZ2VkLmNlbGxzLjQgJT4lIAogIGdncGxvdCguLGFlcyh4ID0gZHksIGNvbG9yID0gdHJlYXRtZW50KSkrCiAgZ2VvbV9kZW5zaXR5KGFlcyh5ID0gLi5zY2FsZWQuLikpKwogIGZhY2V0X2dyaWQocmVkfmRlZ3JvbikrCiAgc2NhbGVfeF9sb2cxMCgpCgpjb252ZXJnZWQuY2VsbHMuNC5vbGQgJT4lIAogIGdncGxvdCguLGFlcyh4ID0gZHksIGNvbG9yID0gdHJlYXRtZW50KSkrCiAgZ2VvbV9kZW5zaXR5KGFlcyh5ID0gLi5zY2FsZWQuLikpKwogIGZhY2V0X2dyaWQocmVkfmRlZ3JvbikrCiAgc2NhbGVfeF9sb2cxMCgpCgojaGFsZiBsaXZlcwpjb252ZXJnZWQuY2VsbHMuNCAlPiUgCiAgZ2dwbG90KC4sYWVzKHggPSBsb2coMikvZHksIGNvbG9yID0gdHJlYXRtZW50KSkrCiAgZ2VvbV9kZW5zaXR5KGFlcyh5ID0gLi5zY2FsZWQuLikpKwogIGZhY2V0X2dyaWQocmVkfmRlZ3JvbikrCiAgc2NhbGVfeF9sb2cxMCgpCgojZG0KY29udmVyZ2VkLmNlbGxzLjQgJT4lIAogIGdncGxvdCguLGFlcyh4ID0gZG0sIGNvbG9yID0gdHJlYXRtZW50KSkrCiAgZ2VvbV9kZW5zaXR5KGFlcyh5ID0gLi5zY2FsZWQuLikpKwogIGZhY2V0X2dyaWQocmVkfmRlZ3JvbikrCiAgc2NhbGVfeF9sb2cxMCgpCmNvbnZlcmdlZC5jZWxscy40Lm9sZCAlPiUgCiAgZ2dwbG90KC4sYWVzKHggPSBkbSwgY29sb3IgPSB0cmVhdG1lbnQpKSsKICBnZW9tX2RlbnNpdHkoYWVzKHkgPSAuLnNjYWxlZC4uKSkrCiAgZmFjZXRfZ3JpZChyZWR+ZGVncm9uKSsKICBzY2FsZV94X2xvZzEwKCkKCiNiYXJwbG90IGZvciBkbQpjb252ZXJnZWQuY2VsbHMuNCAlPiUgCiAgZ2dwbG90KC4sYWVzKHggPSBkbSwgY29sb3IgPSB0cmVhdG1lbnQpKSsKICBnZW9tX2hpc3RvZ3JhbShiaW5zID0gMTAwLCBwb3NpdGlvbiA9ICJpZGVudGl0eSIpKwogIGZhY2V0X2dyaWQocmVkfmRlZ3Jvbiwgc2NhbGVzID0gImZyZWUiKSsKICBzY2FsZV94X2xvZzEwKCkKY29udmVyZ2VkLmNlbGxzLjQub2xkICU+JSAKICBnZ3Bsb3QoLixhZXMoeCA9IGRtLCBjb2xvciA9IHRyZWF0bWVudCkpKwogIGdlb21faGlzdG9ncmFtKGJpbnMgPSAxMDAsIHBvc2l0aW9uID0gImlkZW50aXR5IikrCiAgZmFjZXRfZ3JpZChyZWR+ZGVncm9uLCBzY2FsZXMgPSAiZnJlZSIpKwogIHNjYWxlX3hfbG9nMTAoKQoKI21hdCB0aW1lCmNvbnZlcmdlZC5jZWxscy40ICU+JSAKICBnZ3Bsb3QoLixhZXMoeCA9IGxvZygyKS9kbSwgY29sb3IgPSB0cmVhdG1lbnQpKSsKICBnZW9tX2RlbnNpdHkoYWVzKHkgPSAuLnNjYWxlZC4uKSkrCiAgZmFjZXRfZ3JpZChyZWR+ZGVncm9uKSsKICBzY2FsZV94X2xvZzEwKCkKCiNyc3MKY29udmVyZ2VkLmNlbGxzLjQgJT4lIAogIGdncGxvdCguLGFlcyh4ID0gdmFsdWUsIGNvbG9yID0gdHJlYXRtZW50KSkrCiAgZ2VvbV9kZW5zaXR5KGFlcyh5ID0gLi5zY2FsZWQuLikpKwogIGZhY2V0X2dyaWQocmVkfmRlZ3JvbikrCiAgc2NhbGVfeF9sb2cxMCgpCmBgYAoKZG0gdnMgZ2ZwIGludGVuc2l0eQpgYGB7cn0KY29udmVyZ2VkLmNlbGxzLjQgJT4lIAogIGxlZnRfam9pbiguLGJpbmRfcm93cyhsaXN0Lm9mLmNlbGxzKSAlPiUgCiAgICAgICAgICAgICAgZmlsdGVyKGRlbHRhLnRpbWUgPT0gMCkgJT4lIAogICAgICAgICAgICAgIHNlbGVjdChjZWxsLmlkLCBnZnBNZWFuQmdBRnN1YiksIGJ5ID0gImNlbGwuaWQiKSAlPiUgCiAgZ2dwbG90KC4sYWVzKHggPSBnZnBNZWFuQmdBRnN1YiwgeSA9IGRtLCBjb2xvciA9IHRyZWF0bWVudCkpKwogIGdlb21fcG9pbnQoYWxwaGEgPSAwLjIpKwogIGZhY2V0X2dyaWQocmVkfmRlZ3Jvbiwgc2NhbGVzID0gImZyZWUiKSsKICBzY2FsZV94X2xvZzEwKCkrCiAgc2NhbGVfeV9sb2cxMCgpKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDEwKSAja20gPSAxMAoKY29udmVyZ2VkLmNlbGxzLjQgJT4lIAogIGxlZnRfam9pbiguLGJpbmRfcm93cyhsaXN0Lm9mLmNlbGxzKSAlPiUgCiAgICAgICAgICAgICAgZmlsdGVyKGRlbHRhLnRpbWUgPT0gMCkgJT4lIAogICAgICAgICAgICAgIHNlbGVjdChjZWxsLmlkLCBnZnBNZWFuQmdBRnN1YiksIGJ5ID0gImNlbGwuaWQiKSAlPiUgCiAgZmlsdGVyKHRyZWF0bWVudCAlaW4lIGMoIm5vbmUiLCJkbXNvMSIsImRtc28yIikpICU+JQogIGdncGxvdCguLGFlcyh4ID0gZ2ZwTWVhbkJnQUZzdWIsIHkgPSBkbSwgY29sb3IgPSB0cmVhdG1lbnQpKSsKICBnZW9tX3BvaW50KGFscGhhID0gMC4yKSsKICBmYWNldF9ncmlkKHJlZH5kZWdyb24sIHNjYWxlcyA9ICJmcmVlIikrCiAgc2NhbGVfeF9sb2cxMCgpKwogIHNjYWxlX3lfbG9nMTAoKSsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAxMCkgCgoKCmNvbnZlcmdlZC5jZWxscy40ICU+JSAKICBsZWZ0X2pvaW4oLixiaW5kX3Jvd3MobGlzdC5vZi5jZWxscykgJT4lIAogICAgICAgICAgICAgIGZpbHRlcihkZWx0YS50aW1lID09IDApICU+JSAKICAgICAgICAgICAgICBzZWxlY3QoY2VsbC5pZCwgZ2ZwTWVhbkJnQUZzdWIpLCBieSA9ICJjZWxsLmlkIikgJT4lIAogIGZpbHRlcih0cmVhdG1lbnQgJWluJSBjKCJub25lIiwiZG1zbzEiLCJkbXNvMiIpLCAKICAgICAgICAgZHkgPCAxLCBkZWdyb24gIT0gInN0YWJsZSIpICU+JSAKICBnZ3Bsb3QoLixhZXMoeCA9IGxvZygyKS9keSwgeSA9IGxvZygyKS9kbSwgY29sb3IgPSBnZnBNZWFuQmdBRnN1YikpKwogIGdlb21fcG9pbnQoYWxwaGEgPSAwLjIpKwogIGZhY2V0X2dyaWQocmVkfmRlZ3Jvbiwgc2NhbGVzID0gImZyZWUiKSsKICBzY2FsZV94X2xvZzEwKCkrCiAgc2NhbGVfeV9sb2cxMCgpCmBgYAoKYGBge3J9CmNlbGwuZG0uMTAgPC0gY29udmVyZ2VkLmNlbGxzLjQgJT4lIAogIGZpbHRlcihkbT4xMCApCgpjZWxsLmRtLjEwICU+JSAKICBncm91cF9ieShyZWQsIGRlZ3JvbiwgdHJlYXRtZW50KSAlPiUgCiAgdGFsbHkoKSAlPiUKICByZW5hbWUoIm4uZmFzdC5kbSIgPSAibiIpICU+JSAKICBsZWZ0X2pvaW4oLixjb252ZXJnZWQuY2VsbHMuNCAlPiUgCiAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBfYnkocmVkLCBkZWdyb24sIHRyZWF0bWVudCkgJT4lIAogICAgICAgICAgICAgICAgICAgICAgICAgIHRhbGx5KCksIGJ5ID0gYygicmVkIiwiZGVncm9uIiwidHJlYXRtZW50IikpCgoKCmJpbmRfcm93cyhsaXN0Lm9mLmNlbGxzKSAlPiUgCiAgZmlsdGVyKGNlbGwuaWQgJWluJSBjZWxsLmRtLjEwJGNlbGwuaWQpICU+JSAKICBmaWx0ZXIoZGVsdGEudGltZSA9PSAwKSAlPiUgCiAgZ3JvdXBfYnkodHJlYXRtZW50LCBkZWdyb24sIHJlZCkgJT4lIHRhbGx5KCkKICBmaWx0ZXIoIHRyZWF0bWVudCAlaW4lIGMoIm5vbmUiLCJkbXNvMSIsImRtc28yIikpICU+JSAKICBncm91cF9ieShjZWxsLmlkKSAlPiUgCiAgbXV0YXRlKEl0X0kwID0gZ2ZwTWVhbkJnQUZzdWIvZ2ZwTWVhbkJnQUZzdWJbMV0pICU+JSAKICBnZ3Bsb3QoLixhZXMoeCA9IGRlbHRhLnRpbWUvNjAsIHkgPSBJdF9JMCAsIGdyb3VwX2J5ID0gY2VsbC5pZCAsIGNvbG9yID0gdHJlYXRtZW50KSkrCiAgZ2VvbV9saW5lKGFscGhhID0gMC4yKSsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLjUpKwogIGZhY2V0X2dyaWQocmVkfmRlZ3Jvbiwgc2NhbGVzID0gImZyZWVfeCIpKwogIHNjYWxlX3lfbG9nMTAoKSsKICB0aGVtZV9wdWJyKCkKCmJpbmRfcm93cyhsaXN0Lm9mLmNlbGxzKSAlPiUgCiAgZmlsdGVyKCEoY2VsbC5pZCAlaW4lIGNlbGwuZG0uMTAkY2VsbC5pZCkpICU+JSAKICBmaWx0ZXIoZGVsdGEudGltZSA9PSAwKSAlPiUgCiAgZ3JvdXBfYnkodHJlYXRtZW50LCBkZWdyb24sIHJlZCkgJT4lIHRhbGx5KCkKICBmaWx0ZXIoIHRyZWF0bWVudCAlaW4lIGMoIm5vbmUiLCJkbXNvMSIsImRtc28yIikpICU+JSAKICBncm91cF9ieShjZWxsLmlkKSAlPiUgCiAgbXV0YXRlKEl0X0kwID0gZ2ZwTWVhbkJnQUZzdWIvZ2ZwTWVhbkJnQUZzdWJbMV0pICU+JSAKICBnZ3Bsb3QoLixhZXMoeCA9IGRlbHRhLnRpbWUvNjAsIHkgPSBJdF9JMCAsIGdyb3VwX2J5ID0gY2VsbC5pZCAsIGNvbG9yID0gdHJlYXRtZW50KSkrCiAgZ2VvbV9saW5lKGFscGhhID0gMC4yKSsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLjUpKwogIGZhY2V0X2dyaWQocmVkfmRlZ3Jvbiwgc2NhbGVzID0gImZyZWVfeCIpKwogIHNjYWxlX3lfbG9nMTAoKSsKICB0aGVtZV9wdWJyKCkKCmBgYAoKQUlDIGZ1bmN0aW9uIGVxdWF0aW9uIGZyb20gdGhlIHBhcGVyOiBNY1NoYW5lIGV0IGFsIDIwMTYgOiBLaW5ldGljIGFuYWx5c2lzIG9mIHByb3RlaW4gZGVncmFkYXRpb24gcmV2ZWFscyBhZ2UgZGVwZW5kZW50IGRlZ3JhZGF0aW9uLiAKCiNmb3IgYSBzbWFsbCBzYW1wbGUgc3BhY2UsIHlvdSBhZGQgYSBjb3JyZWN0aW9uIDJrKEsrMSkvKG4tay0xKQpBSUMgPSAyayArIG4gbG9nKFJTUy9uKSArIDJrKEsrMSkvKG4tay0xKQoKbiA9IG5vLiBvZiBkYXRhIHBvaW50cyAoMzEpCmsgPSBuby4gb2YgcGFyYW1ldGVycyBjKDEsMiwzKQpSU1MgPSBSZXNpZHVhbCBzdW0gb2Ygc3F1YXJlcwoKZXhwKChBSUNtaW4g4oiSIEFJQ2kpLzIpIGNhbiBiZSBpbnRlcnByZXRlZCBhcyBiZWluZyBwcm9wb3J0aW9uYWwgdG8gdGhlIHByb2JhYmlsaXR5IHRoYXQgdGhlIGl0aCBtb2RlbCBtaW5pbWl6ZXMgdGhlIChlc3RpbWF0ZWQpIGluZm9ybWF0aW9uIGxvc3MuCmBgYHtyfQphaWMuZm4gPC0gZnVuY3Rpb24oZGYsbil7CiAgCiAgZGYgPC0gZGYgJT4lIAogICAgbXV0YXRlKGFpYyA9IDIqayArIG4qbG9nKHZhbHVlL24pICkgI3dpdGhvdXQgdGhlIGNvcnJlY3Rpb24gZm9yIHNtYWxsIHNhbXBsZSBzcGFjZQogIHJldHVybihkZikKfQoKYGBgCgpgYGB7cn0KYWxsLm1vZGVsLnBhcm0gPC0gY29udmVyZ2VkLmNlbGxzJT4lIAogIG11dGF0ZShtb2RlbCA9ICJkeS5kbS5mIikgJT4lIAogIGJpbmRfcm93cyguLGNvbnZlcmdlZC5jZWxscy4yICU+JSAKICAgICAgICAgICAgICBtdXRhdGUobW9kZWwgPSAiZHkuZiIpKSAlPiUgCiAgYmluZF9yb3dzKC4sY29udmVyZ2VkLmNlbGxzLjMgJT4lIAogICAgICAgICAgICAgIG11dGF0ZShtb2RlbCA9ICJleHBvbmVudGlhbCIpKSAlPiUgCiAgYmluZF9yb3dzKC4sY29udmVyZ2VkLmNlbGxzLjQgJT4lIAogICAgICAgICAgICAgIG11dGF0ZShtb2RlbCA9ICJkeS5kbSIpKQpgYGAKCk9sZCB2YWx1ZXMKYGBge3J9CiNmb3IgdGhyZWUgcGFyIG1vZGVsCmFpYy5keS5mLmRtLm9sZCA8LSBhaWMuZm4oY29udmVyZ2VkLmNlbGxzLm9sZCwgayA9IDMsIG4gPSAzMSkgJT4lIAogIHJlbmFtZSgiZHkuYWxsIiA9ICJkeSIsIAogICAgICAgICAiZi5hbGwiID0gImYiLAogICAgICAgICAiZG0uYWxsIiA9ICJkbSIsCiAgICAgICAgICJyc3MuYWxsIiA9ICJ2YWx1ZSIpICU+JSAKICBzZWxlY3QoY2VsbC5pZCwgZHkuYWxsLCBmLmFsbCwgZG0uYWxsLCByc3MuYWxsLCBhaWMuYWxsLCB0cmVhdG1lbnQsIHJlZCwgZGVncm9uKQoKI2ZvciBkeSBhbmQgZiBtb2RlbCBvbmx5CmFpYy5keS5mLm9sZCA8LSBhaWMuZm4oY29udmVyZ2VkLmNlbGxzLjIub2xkLCBrID0gMiwgbiA9IDMxKSAlPiUgCiAgcmVuYW1lKCJkeS4yIiA9ICJkeSIsIAogICAgICAgICAiZi4yIiA9ICJmIiwKICAgICAgICAgInJzcy4yIiA9ICJ2YWx1ZSIsCiAgICAgICAgICJhaWMuZHkuZiIgPSAiYWljLmFsbCIpICAlPiUgCiAgc2VsZWN0KGNlbGwuaWQsIGR5LjIsIGYuMiwgcnNzLjIsIGFpYy5keS5mLHRyZWF0bWVudCwgcmVkLCBkZWdyb24pCgojZXhwb25lbnRpYWwKYWljLmR5Lm9sZCA8LSBhaWMuZm4oY29udmVyZ2VkLmNlbGxzLjMub2xkLCBrID0gMSwgbiA9IDMxKSAlPiUgCiAgcmVuYW1lKCJkeS5leHAiID0gImR5IiwgCiAgICAgICAgICJyc3MuZXhwIiA9ICJ2YWx1ZSIsCiAgICAgICAgICJhaWMuZXhwIiA9ICJhaWMuYWxsIikgJT4lIAogIHNlbGVjdChjZWxsLmlkLCBkeS5leHAsIHJzcy5leHAsIGFpYy5leHAsdHJlYXRtZW50LCByZWQsIGRlZ3JvbikKCiNtYXQgYW5kIGRlY2F5CmFpYy5keS5kbS5vbGQgPC0gYWljLmZuKGNvbnZlcmdlZC5jZWxscy40Lm9sZCwgayA9IDIsIG4gPSAzMSkgJT4lICAKICByZW5hbWUoImR5Lm1hdCIgPSAiZHkiLCAKICAgICAgICAgImRtLm1hdCIgPSAiZG0iLAogICAgICAgICAicnNzLm1hdCIgPSAidmFsdWUiLAogICAgICAgICAiYWljLm1hdCIgPSAiYWljLmFsbCIpICAlPiUgCiAgc2VsZWN0KGNlbGwuaWQsIGR5Lm1hdCwgZG0ubWF0LHJzcy5tYXQsIGFpYy5tYXQsdHJlYXRtZW50LCByZWQsIGRlZ3JvbikKYGBgCgoKYGBge3J9CmFsbC5tb2RlbC5wYXJtIDwtIGFsbC5tb2RlbC5wYXJtICU+JSAKICBtdXRhdGUoayA9IGNhc2Vfd2hlbihtb2RlbCA9PSAiZHkuZG0uZiIgfiAzLAogICAgICAgICAgICAgICAgICAgICAgIG1vZGVsICVpbiUgYygiZHkuZiIsImR5LmRtIikgfiAyLAogICAgICAgICAgICAgICAgICAgICAgIG1vZGVsID09ICJleHBvbmVudGlhbCIgfiAxKSkKCmBgYAoKYGBge3J9CmFpYy5kZiA8LSBhaWMuZm4oYWxsLm1vZGVsLnBhcm0sIG4gPSAzMSkgJT4lIAogIGdyb3VwX2J5KGNlbGwuaWQpICU+JSAKICBhcnJhbmdlKGNlbGwuaWQpICU+JSAKICB1bmdyb3VwKCkKCgpgYGAKCmBgYHtyfQojZm9yIHRocmVlIHBhciBtb2RlbAojIGFpYy5keS5mLmRtIDwtIGFpYy5mbihjb252ZXJnZWQuY2VsbHMsIGsgPSAzLCBuID0gMzEpICU+JSAKIyAgIHJlbmFtZSgiZHkuYWxsIiA9ICJkeSIsIAojICAgICAgICAgICJmLmFsbCIgPSAiZiIsCiMgICAgICAgICAgImRtLmFsbCIgPSAiZG0iLAojICAgICAgICAgICJyc3MuYWxsIiA9ICJ2YWx1ZSIpICU+JSAKIyAgIHNlbGVjdChjZWxsLmlkLCBkeS5hbGwsIGYuYWxsLCBkbS5hbGwsIHJzcy5hbGwsIGFpYy5hbGwsIHRyZWF0bWVudCwgcmVkLCBkZWdyb24pCiMgCiMgI2ZvciBkeSBhbmQgZiBtb2RlbCBvbmx5CiMgYWljLmR5LmYgPC0gYWljLmZuKGNvbnZlcmdlZC5jZWxscy4yLCBrID0gMiwgbiA9IDMxKSAlPiUgCiMgICByZW5hbWUoImR5LjIiID0gImR5IiwgCiMgICAgICAgICAgImYuMiIgPSAiZiIsCiMgICAgICAgICAgInJzcy4yIiA9ICJ2YWx1ZSIsCiMgICAgICAgICAgImFpYy5keS5mIiA9ICJhaWMuYWxsIikgICU+JSAKIyAgIHNlbGVjdChjZWxsLmlkLCBkeS4yLCBmLjIsIHJzcy4yLCBhaWMuZHkuZix0cmVhdG1lbnQsIHJlZCwgZGVncm9uKQojIAojICNleHBvbmVudGlhbAojIGFpYy5keSA8LSBhaWMuZm4oY29udmVyZ2VkLmNlbGxzLjMsIGsgPSAxLCBuID0gMzEpICU+JSAKIyAgIHJlbmFtZSgiZHkuZXhwIiA9ICJkeSIsIAojICAgICAgICAgICJyc3MuZXhwIiA9ICJ2YWx1ZSIsCiMgICAgICAgICAgImFpYy5leHAiID0gImFpYy5hbGwiKSAlPiUgCiMgICBzZWxlY3QoY2VsbC5pZCwgZHkuZXhwLCByc3MuZXhwLCBhaWMuZXhwLHRyZWF0bWVudCwgcmVkLCBkZWdyb24pCiMgCiMgI21hdCBhbmQgZGVjYXkKIyBhaWMuZHkuZG0gPC0gYWljLmZuKGNvbnZlcmdlZC5jZWxscy40LCBrID0gMiwgbiA9IDMxKSAlPiUgIAojICAgcmVuYW1lKCJkeS5tYXQiID0gImR5IiwgCiMgICAgICAgICAgImRtLm1hdCIgPSAiZG0iLAojICAgICAgICAgICJyc3MubWF0IiA9ICJ2YWx1ZSIsCiMgICAgICAgICAgImFpYy5tYXQiID0gImFpYy5hbGwiKSAgJT4lIAojICAgc2VsZWN0KGNlbGwuaWQsIGR5Lm1hdCwgZG0ubWF0LHJzcy5tYXQsIGFpYy5tYXQsdHJlYXRtZW50LCByZWQsIGRlZ3JvbikKYGBgCgpgYGB7cn0KIyBhaWMuZGYgPC0gYWljLmR5LmYuZG0gJT4lIAojICAgbGVmdF9qb2luKC4sYWljLmR5LmYsIGJ5ID0gYygiY2VsbC5pZCIsICJ0cmVhdG1lbnQiLCAicmVkIiwiZGVncm9uIikpICU+JSAKIyAgIGxlZnRfam9pbiguLGFpYy5keSwgYnkgPSBjKCJjZWxsLmlkIiwgInRyZWF0bWVudCIsICJyZWQiLCJkZWdyb24iKSkgJT4lIAojICAgbGVmdF9qb2luKC4sYWljLmR5LmRtLCBieSA9IGMoImNlbGwuaWQiLCAidHJlYXRtZW50IiwgInJlZCIsImRlZ3JvbiIpKSAKYGBgCgpDb21wYXJpbmcgQUlDIHZhbHVlcwpgYGB7cn0KYWljLmRmICU+JQogIGZpbHRlcih0cmVhdG1lbnQgJWluJSBjKCJub25lIiwiZG1zbzEiLCJkbXNvMiIpKSAlPiUgCiAgZ2dwbG90KC4sYWVzKHggPSBhaWMuYWxsLCB5ID0gYWljLmR5LmYsIGNvbG9yID0gdHJlYXRtZW50KSkrCiAgZ2VvbV9wb2ludChhbHBoYSA9IDAuMikrCiAgZ2VvbV9hYmxpbmUoc2xvcGUgPSAxKSsKICBmYWNldF9ncmlkKHJlZH5kZWdyb24sIHNjYWxlcyA9ICJmcmVlIikKCmFpYy5kZiAlPiUKICBmaWx0ZXIodHJlYXRtZW50ICVpbiUgYygibm9uZSIsImRtc28xIiwiZG1zbzIiKSkgJT4lIAogIGdncGxvdCguLGFlcyh4ID0gYWljLmFsbCwgeSA9IGFpYy5leHAsIGNvbG9yID0gdHJlYXRtZW50KSkrCiAgZ2VvbV9wb2ludChhbHBoYSA9IDAuMikrCiAgZ2VvbV9hYmxpbmUoc2xvcGUgPSAxKSsKICBmYWNldF9ncmlkKHJlZH5kZWdyb24pCgphaWMuZGYgJT4lCiAgZmlsdGVyKHRyZWF0bWVudCAlaW4lIGMoIm5vbmUiLCJkbXNvMSIsImRtc28yIikpICU+JSAKICBnZ3Bsb3QoLixhZXMoeCA9IGFpYy5hbGwsIHkgPSBhaWMubWF0LCBjb2xvciA9IHRyZWF0bWVudCkpKwogIGdlb21fcG9pbnQoYWxwaGEgPSAwLjIpKwogIGdlb21fYWJsaW5lKHNsb3BlID0gMSkrCiAgZmFjZXRfZ3JpZChyZWR+ZGVncm9uKQoKI2ZvciB0aGUgdHJlYXRtZW50IGV4cHMKYWljLmRmICU+JQogIGZpbHRlcih0cmVhdG1lbnQgIT0gIm5vbmUiKSAlPiUgCiAgZ2dwbG90KC4sYWVzKHggPSBhaWMuYWxsLCB5ID0gYWljLm1hdCkpKwogIGdlb21fcG9pbnQoYWxwaGEgPSAwLjIpKwogIGdlb21fYWJsaW5lKHNsb3BlID0gMSkrCiAgZmFjZXRfd3JhcCh+dHJlYXRtZW50KQoKYWljLmRmICU+JQogIGZpbHRlcih0cmVhdG1lbnQgIT0gIm5vbmUiKSAlPiUgCiAgZ2dwbG90KC4sYWVzKHggPSBhaWMuYWxsLCB5ID0gYWljLmR5LmYpKSsKICBnZW9tX3BvaW50KGFscGhhID0gMC4yKSsKICBnZW9tX2FibGluZShzbG9wZSA9IDEpKwogIGZhY2V0X3dyYXAofnRyZWF0bWVudCkKCmFpYy5kZiAlPiUKICBmaWx0ZXIodHJlYXRtZW50ICE9ICJub25lIikgJT4lIAogIGdncGxvdCguLGFlcyh4ID0gYWljLmFsbCwgeSA9IGFpYy5leHApKSsKICBnZW9tX3BvaW50KGFscGhhID0gMC4yKSsKICBnZW9tX2FibGluZShzbG9wZSA9IDEpKwogIGZhY2V0X3dyYXAofnRyZWF0bWVudCkKCgpgYGAKCmBgYHtyfQojcmVwZWF0ZSAyCmFpYy5kZiAlPiUgCiAgZmlsdGVyKGRlZ3JvbiA9PSAiY2xuMi4yIiAmIHJlZCA9PSAicHVwMS1yZnAiKSAlPiUgCiAgc2VsZWN0KGNvbnRhaW5zKCJhaWMiKSkgJT4lIAogIGdncGFpcnMoKQoKI3JlcGVhdGUgMQphaWMuZGYgJT4lIAogIGZpbHRlcihkZWdyb24gPT0gImNsbjIiICYgcmVkID09ICJwdXAxLXJmcCIpICU+JSAKICBzZWxlY3QoY29udGFpbnMoImFpYyIpKSAlPiUgCiAgZ2dwYWlycygpCgoKYWljLmRmICU+JSAKICBmaWx0ZXIoZGVncm9uID09ICJjbG4yLjIiICYgcmVkID09ICJ0ZWYyLW1DaGVycnkiKSAlPiUgCiAgc2VsZWN0KGNvbnRhaW5zKCJhaWMiKSkgJT4lIAogIGdncGFpcnMoKQoKYWljLmRmICU+JSAKICBmaWx0ZXIoZGVncm9uID09ICJjbG4yIiAmIHJlZCA9PSAidGVmMi1tQ2hlcnJ5IikgJT4lIAogIHNlbGVjdChjb250YWlucygiYWljIikpICU+JSAKICBnZ3BhaXJzKCkKYGBgCgpgYGB7cn0KYWljLmRmICU+JSAKICBmaWx0ZXIoZGVncm9uID09ICJtT0RDLjIiICYgcmVkID09ICJwdXAxLXJmcCIpICU+JSAKICBzZWxlY3QoY29udGFpbnMoImFpYyIpKSAlPiUgCiAgZ2dwYWlycygpCgphaWMuZGYgJT4lIAogIGZpbHRlcihkZWdyb24gPT0gIm1PREMiICYgcmVkID09ICJwdXAxLXJmcCIsIHRyZWF0bWVudCA9PSAibm9uZSIpICU+JSAKICBzZWxlY3QoY29udGFpbnMoImFpYyIpKSAlPiUgCiAgZ2dwYWlycygpCgphaWMuZGYgJT4lIAogIGZpbHRlcihkZWdyb24gPT0gIm1PREMuMiIgJiByZWQgPT0gInRlZjItbUNoZXJyeSIpICU+JSAKICBzZWxlY3QoY29udGFpbnMoImFpYyIpKSAlPiUgCiAgZ2dwYWlycygpCgphaWMuZGYgJT4lIAogIGZpbHRlcihkZWdyb24gPT0gIm1PREMiICYgcmVkID09ICJ0ZWYyLW1DaGVycnkiKSAlPiUgCiAgc2VsZWN0KGNvbnRhaW5zKCJhaWMiKSkgJT4lIAogIGdncGFpcnMoKQpgYGAKRGlzdHJpYnV0aW9uIG9mIHRoZSBiZXN0IGZpdCBtb2RlbCAKYGBge3J9CmFpYy5kZiAlPiUgCiAgIyBtdXRhdGUobWluLmFpYyA9IG1pbihhaWMuYWxsLCBhaWMubWF0LCBhaWMuZXhwLCBhaWMuZHkuZikpICU+JSAKICAjIHBpdm90X2xvbmdlcihjb250YWlucygiYWljIikpICU+JSAKICBncm91cF9ieShjZWxsLmlkKSAlPiUgCiAgZmlsdGVyKGFpYyA9PSBtaW4oYWljKSkgJT4lIAogIHVuZ3JvdXAoKSAlPiUgCiAgIyBwaXZvdF93aWRlcihuYW1lc19mcm9tID0gbmFtZSwgdmFsdWVzX2Zyb20gPSB2YWx1ZSkgJT4lIAogIGdyb3VwX2J5KHRyZWF0bWVudCwgcmVkLCBkZWdyb24sIG1vZGVsKSAlPiUgCiAgdGFsbHkoKSAlPiUgCiAgYXJyYW5nZShkZXNjKG4pKSAlPiUgCiAgdW5ncm91cCgpICU+JSAKICBmaWx0ZXIodHJlYXRtZW50ID09ICJub25lIikgJT4lIAogIGdncGxvdCguLGFlcyh4ID0gbW9kZWwsIHkgPSBuKSkrCiAgZ2VvbV9jb2woKSsKICBmYWNldF9ncmlkKHJlZH5kZWdyb24sIHNjYWxlcyA9ICJmcmVlX3kiKSsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEpKQoKYWljLmRmICU+JSAKICAjIG11dGF0ZShtaW4uYWljID0gbWluKGFpYy5hbGwsIGFpYy5tYXQsIGFpYy5leHAsIGFpYy5keS5mKSkgJT4lIAogIHBpdm90X2xvbmdlcihjb250YWlucygiYWljIikpICU+JSAKICBncm91cF9ieShjZWxsLmlkKSAlPiUgCiAgZmlsdGVyKHZhbHVlID09IG1pbih2YWx1ZSkpICU+JSAKICB1bmdyb3VwKCkgJT4lIAogICMgcGl2b3Rfd2lkZXIobmFtZXNfZnJvbSA9IG5hbWUsIHZhbHVlc19mcm9tID0gdmFsdWUpICU+JSAKICBncm91cF9ieSh0cmVhdG1lbnQsIHJlZCwgZGVncm9uLCBuYW1lKSAlPiUgCiAgdGFsbHkoKSAlPiUgCiAgdW5ncm91cCgpICU+JSAKICBmaWx0ZXIodHJlYXRtZW50ICE9ICJub25lIikgJT4lIAogIGdncGxvdCguLGFlcyh4ID0gbmFtZSwgeT0gbikpKwogIGdlb21fY29sKCkrCiAgZmFjZXRfd3JhcCh+dHJlYXRtZW50LCBzY2FsZXMgPSAiZnJlZV95IikrCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxKSkKYGBgCgpgYGB7cn0KYWljLmRmICU+JSAKICBncm91cF9ieSh0cmVhdG1lbnQsIHJlZCwgZGVncm9uLG1vZGVsKSAlPiUgCiAgdGFsbHkoKQpgYGAKCmNvbXBhcmluZyB0aGUgcmF0ZXMgb2YgZGVjYXkgZnJvbSB2YXJpb3VzIG1vZGVscwpgYGB7cn0KYWljLmRmICU+JQogIGZpbHRlcih0cmVhdG1lbnQgJWluJSBjKCJub25lIiwiZG1zbzEiLCJkbXNvMiIpLCAKICAgICAgICAgZHkuYWxsIDwgMSwgZHkuMiA8MSwgZHkuZXhwIDwxICwgZHkubWF0IDwxKSAlPiUgCiAgZ2dwbG90KC4sYWVzKHggPSBkeS5hbGwsIHkgPSBkeS4yLCBjb2xvciA9IHRyZWF0bWVudCkpKwogIGdlb21fcG9pbnQoYWxwaGEgPSAwLjIpKwogIGdlb21fYWJsaW5lKHNsb3BlID0gMSkrCiAgZmFjZXRfZ3JpZChyZWR+ZGVncm9uLCBzY2FsZXMgPSAiZnJlZSIpKwogIHNjYWxlX3hfbG9nMTAoKSsKICBzY2FsZV95X2xvZzEwKCkrCiAgeGxhYigicmF0ZSBvZiBkZWNheSBmcm9tIHRoZSAzIHBhciBtb2RlbCIpKwogIHlsYWIoInJhdGUgb2YgZGVjYXkgZnJvbSAyIHBhciBtb2RlbCAoZiwgZHkpIikKCmFpYy5kZiAlPiUKICBmaWx0ZXIodHJlYXRtZW50ICVpbiUgYygibm9uZSIsImRtc28xIiwiZG1zbzIiKSwgCiAgICAgICAgIGR5LmFsbCA8IDEsIGR5LjIgPDEsIGR5LmV4cCA8MSAsIGR5Lm1hdCA8MSkgICU+JSAKICBnZ3Bsb3QoLixhZXMoeCA9IGR5LmFsbCwgeSA9IGR5LmV4cCwgY29sb3IgPSB0cmVhdG1lbnQpKSsKICBnZW9tX3BvaW50KGFscGhhID0gMC4yKSsKICBnZW9tX2FibGluZShzbG9wZSA9IDEpKwogIGZhY2V0X2dyaWQocmVkfmRlZ3Jvbiwgc2NhbGVzID0gImZyZWUiKSsKICBzY2FsZV94X2xvZzEwKCkrCiAgc2NhbGVfeV9sb2cxMCgpKwogIHhsYWIoInJhdGUgb2YgZGVjYXkgZnJvbSB0aGUgMyBwYXIgbW9kZWwiKSsKICB5bGFiKCJyYXRlIG9mIGRlY2F5IGZyb20gMSBwYXIgbW9kZWwgKCBkeSkiKQoKYWljLmRmICU+JQogIGZpbHRlcih0cmVhdG1lbnQgJWluJSBjKCJub25lIiwiZG1zbzEiLCJkbXNvMiIpLCAKICAgICAgICAgZHkuYWxsIDwgMSwgZHkuMiA8MSwgZHkuZXhwIDwxICwgZHkubWF0IDwxKSAlPiUgCiAgZ2dwbG90KC4sYWVzKHggPSBkeS5hbGwsIHkgPSBkeS5tYXQsIGNvbG9yID0gdHJlYXRtZW50KSkrCiAgZ2VvbV9wb2ludChhbHBoYSA9IDAuMikrCiAgZ2VvbV9hYmxpbmUoc2xvcGUgPSAxKSsKICBmYWNldF9ncmlkKHJlZH5kZWdyb24sIHNjYWxlcyA9ICJmcmVlIikrCiAgc2NhbGVfeF9sb2cxMCgpKwogIHNjYWxlX3lfbG9nMTAoKSsKICB4bGFiKCJyYXRlIG9mIGRlY2F5IGZyb20gdGhlIDMgcGFyIG1vZGVsIikrCiAgeWxhYigicmF0ZSBvZiBkZWNheSBmcm9tIDIgcGFyIG1vZGVsICggZHksIGRtKSIpCmBgYAptYXR1cmF0aW9uIHJhdGVzCmBgYHtyfQphaWMuZGYgJT4lCiAgZmlsdGVyKHRyZWF0bWVudCAlaW4lIGMoIm5vbmUiLCJkbXNvMSIsImRtc28yIiksIAogICAgICAgICBkeS5hbGwgPCAxLCBkeS4yIDwxLCBkeS5leHAgPDEgLCBkeS5tYXQgPDEpICU+JSAKICBnZ3Bsb3QoLixhZXMoeCA9IGRtLmFsbCwgeSA9IGRtLm1hdCwgY29sb3IgPSB0cmVhdG1lbnQpKSsKICBnZW9tX3BvaW50KGFscGhhID0gMC4yKSsKICBnZW9tX2FibGluZShzbG9wZSA9IDEpKwogIGZhY2V0X2dyaWQocmVkfmRlZ3Jvbiwgc2NhbGVzID0gImZyZWUiKSsKICBzY2FsZV94X2xvZzEwKCkrCiAgc2NhbGVfeV9sb2cxMCgpKwogIHhsYWIoInJhdGUgb2YgbWF0dXJhdGlvbiBmcm9tIHRoZSAzIHBhciBtb2RlbCIpKwogIHlsYWIoInJhdGUgb2YgbWF0dXJhdGlvbiBmcm9tIDIgcGFyIG1vZGVsICggZHksIGRtKSIpCgoKYGBgCmYgdmFsdWVzCmBgYHtyfQphaWMuZGYgJT4lCiAgZmlsdGVyKHRyZWF0bWVudCAlaW4lIGMoIm5vbmUiKSwgCiAgICAgICAgIGR5LmFsbCA8IDEsIGR5LjIgPDEsIGR5LmV4cCA8MSAsIGR5Lm1hdCA8MSkgJT4lIAogIGdncGxvdCguLGFlcyh4ID0gZi5hbGwsIHkgPSBmLjIsIGNvbG9yID0gdHJlYXRtZW50KSkrCiAgZ2VvbV9wb2ludChhbHBoYSA9IDAuMikrCiAgZ2VvbV9hYmxpbmUoc2xvcGUgPSAxKSsKICBmYWNldF9ncmlkKHJlZH5kZWdyb24sIHNjYWxlcyA9ICJmcmVlIikrCiAgeGxhYigiZnJhYyBvZiB0cmFuc2xhdGlvbiBmcm9tIHRoZSAzIHBhciBtb2RlbCIpKwogIHlsYWIoImZyYWMgb2YgdHJhbnNsYXRpb24gZnJvbSAyIHBhciBtb2RlbCAoIGR5LCBmKSIpCmBgYAoKYGBge3J9CmFpYy5kZiAlPiUKICBmaWx0ZXIodHJlYXRtZW50ICVpbiUgYygibm9uZSIpLCAKICAgICAgICAgZHkuYWxsIDwgMSwgZHkuMiA8MSwgZHkuZXhwIDwxICwgZHkubWF0IDwxKSAlPiUgCiAgZ3JvdXBfYnkodHJlYXRtZW50LCByZWQsIGRlZ3JvbikgJT4lIAogIHN1bW1hcmlzZShhdmcuZHkuYWxsID0gbWVhbihkeS5hbGwpLAogICAgICAgICAgICBhdmcuZHkuMiA9IG1lYW4oZHkuMiksCiAgICAgICAgICAgIGF2Zy5keS5leHAgPSBtZWFuKGR5LmV4cCksCiAgICAgICAgICAgIGF2Zy5keS5tYXQgPSBtZWFuKGR5Lm1hdCkpCmBgYAoKI2RlY2F5IHJhdGUgZGlzdHJpYnV0aW9uIHBsb3RzCmBgYHtyfQphaWMuZGYgJT4lCiAgZmlsdGVyKHRyZWF0bWVudCAlaW4lIGMoIm5vbmUiKSwgCiAgICAgICAgIGR5LmFsbCA8IDEsIGR5LjIgPDEsIGR5LmV4cCA8MSAsIGR5Lm1hdCA8MSkgJT4lIAogIHNlbGVjdChjZWxsLmlkLCBkeS5hbGwsIGR5LjIsIGR5LmV4cCwgZHkubWF0LCB0cmVhdG1lbnQsIHJlZCwgZGVncm9uKSAlPiUgCiAgcGl2b3RfbG9uZ2VyKGNvbHMgPSAyOjUpICU+JSAKICBnZ3Bsb3QoLixhZXMoeCA9IHZhbHVlLCAgZmlsbCA9IG5hbWUpKSsKICBnZW9tX2hpc3RvZ3JhbSggYWxwaGEgPSAwLjUpKwogIGZhY2V0X2dyaWQocmVkfmRlZ3Jvbiwgc2NhbGVzID0gImZyZWUiKSsKICBzY2FsZV94X2xvZzEwKCkrCiAgdGhlbWVfcHVicigpCgphaWMuZGYgJT4lCiAgZmlsdGVyKHRyZWF0bWVudCAlaW4lIGMoIm5vbmUiKSwgCiAgICAgICAgIGR5LmFsbCA8IDEsIGR5LjIgPDEsIGR5LmV4cCA8MSAsIGR5Lm1hdCA8MSAsIAogICAgICAgICBkZWdyb24gPT0gImNsbjIuMiIpICU+JSAKICBzZWxlY3QoY2VsbC5pZCwgZHkuYWxsLCBkeS4yLCBkeS5leHAsIGR5Lm1hdCwgdHJlYXRtZW50LCByZWQsIGRlZ3JvbikgJT4lIAogIHBpdm90X2xvbmdlcihjb2xzID0gMjo1KSAlPiUgCiAgZ2dwbG90KC4sYWVzKHggPSBsb2coMikvdmFsdWUsICBmaWxsID0gbmFtZSkpKwogIGdlb21fZGVuc2l0eSggYWVzKHkgPSAuLnNjYWxlZC4uKSxhbHBoYSA9IDAuNSkrCiAgZmFjZXRfZ3JpZChyZWR+ZGVncm9uLCBzY2FsZXMgPSAiZnJlZSIpKwogIHRoZW1lX3B1YnIoKSsKICBzY2FsZV94X2NvbnRpbnVvdXMoKQoKYWljLmRmICU+JQogIGZpbHRlcih0cmVhdG1lbnQgJWluJSBjKCJub25lIiksIAogICAgICAgICBkeS5hbGwgPCAxLCBkeS4yIDwxLCBkeS5leHAgPDEgLCBkeS5tYXQgPDEgLCAKICAgICAgICAgZGVncm9uICVpbiUgYygibU9EQyIsIm1PREMuMiIpICkgJT4lIAogIHNlbGVjdChjZWxsLmlkLCBkeS5hbGwsIGR5LjIsIGR5LmV4cCwgZHkubWF0LCB0cmVhdG1lbnQsIHJlZCwgZGVncm9uKSAlPiUgCiAgcGl2b3RfbG9uZ2VyKGNvbHMgPSAyOjUpICU+JSAKICBnZ3Bsb3QoLixhZXMoeCA9IGxvZygyKS92YWx1ZSwgIGZpbGwgPSBuYW1lKSkrCiAgZ2VvbV9kZW5zaXR5KCBhZXMoeSA9IC4uc2NhbGVkLi4pLGFscGhhID0gMC41KSsKICBmYWNldF9ncmlkKHJlZH5kZWdyb24sIHNjYWxlcyA9ICJmcmVlIikrCiAgdGhlbWVfcHVicigpKwogIHNjYWxlX3hfY29udGludW91cygpCiAKYGBgCgpgYGB7cn0KYWljLmRmICU+JQogIGZpbHRlcih0cmVhdG1lbnQgJWluJSBjKCJub25lIiksIAogICAgICAgICBkeS5hbGwgPCAxLCBkeS4yIDwxLCBkeS5leHAgPDEgLCBkeS5tYXQgPDEgLCAKICAgICAgICAgZGVncm9uID09ICJjbG4yLjIiLCAKICAgICAgICAgcmVkID09ICJwdXAxLXJmcCIpICU+JSAKICBzZWxlY3QoY2VsbC5pZCwgZHkuYWxsLCBkeS4yLCBkeS5leHAsIGR5Lm1hdCwgdHJlYXRtZW50LCByZWQsIGRlZ3JvbikgJT4lIAogIHNlbGVjdChjb250YWlucygiZHkiKSkgJT4lIAogIGdncGFpcnMoKQoKYWljLmRmICU+JQogIGZpbHRlcih0cmVhdG1lbnQgJWluJSBjKCJub25lIiksIAogICAgICAgICBkeS5hbGwgPCAxLCBkeS4yIDwxLCBkeS5leHAgPDEgLCBkeS5tYXQgPDEgLCAKICAgICAgICAgZGVncm9uID09ICJjbG4yLjIiLCAKICAgICAgICAgcmVkID09ICJ0ZWYyLW1DaGVycnkiKSAlPiUgCiAgc2VsZWN0KGNlbGwuaWQsIGR5LmFsbCwgZHkuMiwgZHkuZXhwLCBkeS5tYXQsIHRyZWF0bWVudCwgcmVkLCBkZWdyb24pICU+JSAKICBzZWxlY3QoY29udGFpbnMoImR5IikpICU+JSAKICBnZ3BhaXJzKCkKYGBgCgpgYGB7cn0KYWljLmRmICU+JQogIGZpbHRlcih0cmVhdG1lbnQgJWluJSBjKCJub25lIiksIAogICAgICAgICBkeS5hbGwgPCAxLCBkeS4yIDwxLCBkeS5leHAgPDEgLCBkeS5tYXQgPDEgLCAKICAgICAgICAgZGVncm9uID09ICJtT0RDLjIiLCAKICAgICAgICAgcmVkID09ICJwdXAxLXJmcCIpICU+JSAKICBzZWxlY3QoY2VsbC5pZCwgZHkuYWxsLCBkeS4yLCBkeS5leHAsIGR5Lm1hdCwgdHJlYXRtZW50LCByZWQsIGRlZ3JvbikgJT4lIAogIHNlbGVjdChjb250YWlucygiZHkiKSkgJT4lIAogIGdncGFpcnMoKQoKYWljLmRmICU+JQogIGZpbHRlcih0cmVhdG1lbnQgJWluJSBjKCJub25lIiksIAogICAgICAgICBkeS5hbGwgPCAxLCBkeS4yIDwxLCBkeS5leHAgPDEgLCBkeS5tYXQgPDEgLCAKICAgICAgICAgZGVncm9uID09ICJtT0RDLjIiLCAKICAgICAgICAgcmVkID09ICJ0ZWYyLW1DaGVycnkiKSAlPiUgCiAgc2VsZWN0KGNlbGwuaWQsIGR5LmFsbCwgZHkuMiwgZHkuZXhwLCBkeS5tYXQsIHRyZWF0bWVudCwgcmVkLCBkZWdyb24pICU+JSAKICBzZWxlY3QoY29udGFpbnMoImR5IikpICU+JSAKICBnZ3BhaXJzKCkKYGBgCgoKd2hlbiB5b3UgYWRkIHByb3RlYXNvbWUgaW5oaWJ0b3IsIHRoZXJlIAoKYGBge3J9CmFpYy5kZiAlPiUgCiAgZmlsdGVyKHRyZWF0bWVudCA9PSAibm9uZSIsIGxvZygyKS9kbSA8NDApICU+JSAKICBnZ3Bsb3QoLixhZXMoeCA9IGxvZygyKS9kbSwgeSA9IGxvZygyKS9keS54ICkpKwogIGdlb21fcG9pbnQoYWxwaGEgPSAwLjUpKwogIGZhY2V0X2dyaWQocmVkfmRlZ3JvbiAsIHNjYWxlcyA9ICJmcmVlIikrCiAgc2NhbGVfeF9jb250aW51b3VzKCkrCiAgc2NhbGVfeV9jb250aW51b3VzKCkrCiAgZ2VvbV9hYmxpbmUoc2xvcGUgPSAxKQpgYGAKCgoKCiNTYXZpbmcgdGhlIGRhdGEKYGBge3J9CiMgYWljLmRmICU+JSAKIyAgIHdyaXRlX2NzdiguLHBhdGggPSAifi9wbG90cy9hbGxfZGF0YS9haWMuY3N2IikKCiN1cGRhdGluZyB0aGUgQUlDIGRmIHdpdGggdGhlIG5ldyBleHBlcmltZW50cyAKIyByZWFkX2Nzdigifi9wbG90cy9hbGxfZGF0YS9haWMuY3N2IikgJT4lIAojICAgZmlsdGVyKCEoZGVncm9uICVpbiUgYygic3RhYmxlIiwgInN0YWJsZS4yIikgfCB0cmVhdG1lbnQgPT0gIjUwdU0iKSkgJT4lIAojICAgYmluZF9yb3dzKC4sYWljLmRmKSAlPiUgCiMgICB3cml0ZV9jc3YoLixwYXRoID0gIn4vcGxvdHMvYWxsX2RhdGEvYWljLmNzdiIpCgojMTAtMTgtMjIKcmVhZF9jc3YoIn4vcGxvdHMvYWxsX2RhdGEvYWljLmNzdiIpICU+JSAKICBiaW5kX3Jvd3MoLixhaWMuZGYpICU+JSAKICB3cml0ZV9jc3YoLixwYXRoID0gIn4vcGxvdHMvYWxsX2RhdGEvYWljLmNzdiIpCgoKCmBgYAoKYGBge3J9CiMgYWxsLm1vZGVsLnBhcm0gJT4lIAojICAgd3JpdGVfY3N2KC4sIn4vcGxvdHMvYWxsX2RhdGEvbW9kZWxfcGFybXNfMi5jc3YiKQoKIyBhbGwubW9kZWwucGFybTIgPC0gcmVhZF9jc3YoIn4vcGxvdHMvYWxsX2RhdGEvbW9kZWxfcGFybXNfMi5jc3YiKSAlPiUgCiMgICBmaWx0ZXIoIShkZWdyb24gJWluJSBjKCJzdGFibGUiLCAic3RhYmxlLjIiKSB8IHRyZWF0bWVudCA9PSAiNTB1TSIpKSAlPiUgCiMgICBiaW5kX3Jvd3MoLixhbGwubW9kZWwucGFybSkgCiMgICAKIyAgIAojIGFsbC5tb2RlbC5wYXJtMiAlPiUgCiMgICB3cml0ZV9jc3YoLiwifi9wbG90cy9hbGxfZGF0YS9tb2RlbF9wYXJtc18yLmNzdiIpCgojMTAtMTgtMjIKcmVhZF9jc3YoIn4vcGxvdHMvYWxsX2RhdGEvbW9kZWxfcGFybXNfMi5jc3YiKSAlPiUgCiAgYmluZF9yb3dzKC4sYWxsLm1vZGVsLnBhcm0pICU+JSAKICB3cml0ZV9jc3YoLiwifi9wbG90cy9hbGxfZGF0YS9tb2RlbF9wYXJtc18yLmNzdiIpCmBgYAoKZGVjYXkgcmF0ZSBkaXN0cmlidXRpb24gd2l0aCBtYXR1cmF0aW9uIG1vZGVsCmBgYHtyfQoKYWljLmRmICU+JQogIGZpbHRlcih0cmVhdG1lbnQgJWluJSBjKCJub25lIiksIAogICAgICAgICBkeS5hbGwgPCAxLCBkeS4yIDwxLCBkeS5leHAgPDEgLCBkeS5tYXQgPDEgLCAKICAgICAgICAgZGVncm9uID09ICJjbG4yLjIiKSAlPiUgCiAgc2VsZWN0KGNlbGwuaWQsIGR5LmFsbCwgZHkuMiwgZHkuZXhwLCBkeS5tYXQsIHRyZWF0bWVudCwgcmVkLCBkZWdyb24pICU+JSAKICBwaXZvdF9sb25nZXIoY29scyA9IDI6NSkgJT4lIAogIGdncGxvdCguLGFlcyh4ID0gbG9nKDIpL3ZhbHVlLCAgZmlsbCA9IG5hbWUpKSsKICBnZW9tX2RlbnNpdHkoIGFlcyh5ID0gLi5zY2FsZWQuLiksYWxwaGEgPSAwLjUpKwogIGZhY2V0X2dyaWQocmVkfmRlZ3Jvbiwgc2NhbGVzID0gImZyZWUiKSsKICB0aGVtZV9wdWJyKCkrCiAgc2NhbGVfeF9jb250aW51b3VzKCkKCmBgYAoKYGBge3J9CmFpYy5kZiAlPiUKICBmaWx0ZXIodHJlYXRtZW50ICVpbiUgYygibm9uZSIpLCAKICAgICAgICAgZHkuYWxsIDwgMSwgZHkuMiA8MSwgZHkuZXhwIDwxICwgZHkubWF0IDwxICwgCiAgICAgICAgIGRlZ3JvbiAlaW4lIGMoIm1PREMiLCJtT0RDLjIiKSApICU+JSAKICBzZWxlY3QoY2VsbC5pZCwgZHkubWF0LCB0cmVhdG1lbnQsIHJlZCwgZGVncm9uKSAlPiUgCiAgbGVmdF9qb2luKC4sYmluZF9yb3dzKGxpc3Qub2YuY2VsbHMpICU+JSBmaWx0ZXIoZGVsdGEudGltZSA9PSAwKSwgYnkgPSBjKCJjZWxsLmlkIiwicmVkIiwiZGVncm9uIiwidHJlYXRtZW50IikpICU+JSAKICBnZ3Bsb3QoLixhZXMoeSA9IGR5Lm1hdCwgeCA9IGdmcE1lYW5CZ0FGc3ViLCBjb2xvciA9IGRlZ3JvbikpKwogIGdlb21fcG9pbnQoIGFscGhhID0gMC41KSsKICBmYWNldF93cmFwKH5yZWQsIHNjYWxlcyA9ICJmcmVlIikrCiAgdGhlbWVfcHVicigpKwogIHNjYWxlX3hfY29udGludW91cygpKwogIHN0YXRfY29yKCkKCmFpYy5kZiAlPiUKICBmaWx0ZXIodHJlYXRtZW50ICVpbiUgYygibm9uZSIpLCAKICAgICAgICAgZHkuYWxsIDwgMSwgZHkuMiA8MSwgZHkuZXhwIDwxICwgZHkubWF0IDwxICwgCiAgICAgICAgIGRlZ3JvbiAlaW4lIGMoIm1PREMiLCJtT0RDLjIiKSApICU+JSAKICBzZWxlY3QoY2VsbC5pZCwgZHkuMiwgdHJlYXRtZW50LCByZWQsIGRlZ3JvbikgJT4lIAogIGxlZnRfam9pbiguLGJpbmRfcm93cyhsaXN0Lm9mLmNlbGxzKSAlPiUgZmlsdGVyKGRlbHRhLnRpbWUgPT0gMCksIGJ5ID0gYygiY2VsbC5pZCIsInJlZCIsImRlZ3JvbiIsInRyZWF0bWVudCIpKSAlPiUgCiAgZ2dwbG90KC4sYWVzKHkgPSBkeS4yLCB4ID0gZ2ZwTWVhbkJnQUZzdWIsIGNvbG9yID0gZGVncm9uKSkrCiAgZ2VvbV9wb2ludCggYWxwaGEgPSAwLjUpKwogIGZhY2V0X3dyYXAofnJlZCwgc2NhbGVzID0gImZyZWUiKSsKICB0aGVtZV9wdWJyKCkrCiAgc2NhbGVfeF9jb250aW51b3VzKCkrCiAgc3RhdF9jb3IoKQoKYWljLmRmICU+JQogIGZpbHRlcih0cmVhdG1lbnQgJWluJSBjKCJub25lIiksIAogICAgICAgICBkeS5hbGwgPCAxLCBkeS4yIDwxLCBkeS5leHAgPDEgLCBkeS5tYXQgPDEgLCAKICAgICAgICAgZGVncm9uICVpbiUgYygibU9EQyIsIm1PREMuMiIpICkgJT4lIAogIHNlbGVjdChjZWxsLmlkLCBkeS5hbGwsIHRyZWF0bWVudCwgcmVkLCBkZWdyb24pICU+JSAKICBsZWZ0X2pvaW4oLixiaW5kX3Jvd3MobGlzdC5vZi5jZWxscykgJT4lIGZpbHRlcihkZWx0YS50aW1lID09IDApLCBieSA9IGMoImNlbGwuaWQiLCJyZWQiLCJkZWdyb24iLCJ0cmVhdG1lbnQiKSkgJT4lIAogIGdncGxvdCguLGFlcyh5ID0gZHkuYWxsLCB4ID0gZ2ZwTWVhbkJnQUZzdWIsIGNvbG9yID0gZGVncm9uKSkrCiAgZ2VvbV9wb2ludCggYWxwaGEgPSAwLjUpKwogIGZhY2V0X3dyYXAofnJlZCwgc2NhbGVzID0gImZyZWUiKSsKICB0aGVtZV9wdWJyKCkrCiAgc2NhbGVfeF9jb250aW51b3VzKCkrCiAgc3RhdF9jb3IoKQoKYWljLmRmICU+JQogIGZpbHRlcih0cmVhdG1lbnQgJWluJSBjKCJub25lIiksIAogICAgICAgICBkeS5hbGwgPCAxLCBkeS4yIDwxLCBkeS5leHAgPDEgLCBkeS5tYXQgPDEgLCAKICAgICAgICAgZGVncm9uICVpbiUgYygibU9EQyIsIm1PREMuMiIpICkgJT4lIAogIHNlbGVjdChjZWxsLmlkLCBkeS5leHAsIHRyZWF0bWVudCwgcmVkLCBkZWdyb24pICU+JSAKICBsZWZ0X2pvaW4oLixiaW5kX3Jvd3MobGlzdC5vZi5jZWxscykgJT4lIGZpbHRlcihkZWx0YS50aW1lID09IDApLCBieSA9IGMoImNlbGwuaWQiLCJyZWQiLCJkZWdyb24iLCJ0cmVhdG1lbnQiKSkgJT4lIAogIGdncGxvdCguLGFlcyh5ID0gZHkuZXhwLCB4ID0gZ2ZwTWVhbkJnQUZzdWIsIGNvbG9yID0gZGVncm9uKSkrCiAgZ2VvbV9wb2ludCggYWxwaGEgPSAwLjUpKwogIGZhY2V0X3dyYXAofnJlZCwgc2NhbGVzID0gImZyZWUiKSsKICB0aGVtZV9wdWJyKCkrCiAgc2NhbGVfeF9jb250aW51b3VzKCkrCiAgc3RhdF9jb3IoKQoKYGBgCgpgYGB7cn0KIAphaWMuZGYgJT4lCiAgZmlsdGVyKHRyZWF0bWVudCAlaW4lIGMoIm5vbmUiKSwgCiAgICAgICAgIGR5LmFsbCA8IDEsIGR5LjIgPDEsIGR5LmV4cCA8MSAsIGR5Lm1hdCA8MSAsIAogICAgICAgICBkZWdyb24gJWluJSBjKCJjbG4yIiwiY2xuMi4yIikgKSAlPiUgCiAgc2VsZWN0KGNlbGwuaWQsIGR5Lm1hdCwgdHJlYXRtZW50LCByZWQsIGRlZ3JvbikgJT4lIAogIGxlZnRfam9pbiguLGJpbmRfcm93cyhsaXN0Lm9mLmNlbGxzKSAlPiUgZmlsdGVyKGRlbHRhLnRpbWUgPT0gMCksIGJ5ID0gYygiY2VsbC5pZCIsInJlZCIsImRlZ3JvbiIsInRyZWF0bWVudCIpKSAlPiUgCiAgZ2dwbG90KC4sYWVzKHkgPSBkeS5tYXQsIHggPSBnZnBNZWFuQmdBRnN1YiwgY29sb3IgPSBkZWdyb24pKSsKICBnZW9tX3BvaW50KCBhbHBoYSA9IDAuNSkrCiAgZmFjZXRfZ3JpZCh+cmVkLCBzY2FsZXMgPSAiZnJlZSIpKwogIHRoZW1lX3B1YnIoKSsKICBzY2FsZV94X2NvbnRpbnVvdXMoKSsKICBzdGF0X2NvcigpCgphaWMuZGYgJT4lCiAgZmlsdGVyKHRyZWF0bWVudCAlaW4lIGMoIm5vbmUiKSwgCiAgICAgICAgIGR5LmFsbCA8IDEsIGR5LjIgPDEsIGR5LmV4cCA8MSAsIGR5Lm1hdCA8MSAsIAogICAgICAgICBkZWdyb24gJWluJSBjKCJjbG4yIiwiY2xuMi4yIikgKSAlPiUgCiAgc2VsZWN0KGNlbGwuaWQsIGR5LjIsIHRyZWF0bWVudCwgcmVkLCBkZWdyb24pICU+JSAKICBsZWZ0X2pvaW4oLixiaW5kX3Jvd3MobGlzdC5vZi5jZWxscykgJT4lIGZpbHRlcihkZWx0YS50aW1lID09IDApLCBieSA9IGMoImNlbGwuaWQiLCJyZWQiLCJkZWdyb24iLCJ0cmVhdG1lbnQiKSkgJT4lIAogIGdncGxvdCguLGFlcyh5ID0gZHkuMiwgeCA9IGdmcE1lYW5CZ0FGc3ViLCBjb2xvciA9IGRlZ3JvbikpKwogIGdlb21fcG9pbnQoIGFscGhhID0gMC41KSsKICBmYWNldF9ncmlkKH5yZWQsIHNjYWxlcyA9ICJmcmVlIikrCiAgdGhlbWVfcHVicigpKwogIHNjYWxlX3hfY29udGludW91cygpKwogIHN0YXRfY29yKCkKCmFpYy5kZiAlPiUKICBmaWx0ZXIodHJlYXRtZW50ICVpbiUgYygibm9uZSIpLCAKICAgICAgICAgZHkuYWxsIDwgMSwgZHkuMiA8MSwgZHkuZXhwIDwxICwgZHkubWF0IDwxICwgCiAgICAgICAgIGRlZ3JvbiAlaW4lIGMoImNsbjIiLCJjbG4yLjIiKSApICU+JSAKICBzZWxlY3QoY2VsbC5pZCwgZHkuZXhwLCB0cmVhdG1lbnQsIHJlZCwgZGVncm9uKSAlPiUgCiAgbGVmdF9qb2luKC4sYmluZF9yb3dzKGxpc3Qub2YuY2VsbHMpICU+JSBmaWx0ZXIoZGVsdGEudGltZSA9PSAwKSwgYnkgPSBjKCJjZWxsLmlkIiwicmVkIiwiZGVncm9uIiwidHJlYXRtZW50IikpICU+JSAKICBnZ3Bsb3QoLixhZXMoeSA9IGR5LmV4cCwgeCA9IGdmcE1lYW5CZ0FGc3ViLCBjb2xvciA9IGRlZ3JvbikpKwogIGdlb21fcG9pbnQoIGFscGhhID0gMC41KSsKICBmYWNldF9ncmlkKH5yZWQsIHNjYWxlcyA9ICJmcmVlIikrCiAgdGhlbWVfcHVicigpKwogIHNjYWxlX3hfY29udGludW91cygpKwogIHN0YXRfY29yKCkKCmFpYy5kZiAlPiUKICBmaWx0ZXIodHJlYXRtZW50ICVpbiUgYygibm9uZSIpLCAKICAgICAgICAgZHkuYWxsIDwgMSwgZHkuMiA8MSwgZHkuZXhwIDwxICwgZHkubWF0IDwxICwgCiAgICAgICAgIGRlZ3JvbiAlaW4lIGMoImNsbjIiLCJjbG4yLjIiKSApICU+JSAKICBzZWxlY3QoY2VsbC5pZCwgZHkuYWxsLCB0cmVhdG1lbnQsIHJlZCwgZGVncm9uKSAlPiUgCiAgbGVmdF9qb2luKC4sYmluZF9yb3dzKGxpc3Qub2YuY2VsbHMpICU+JSBmaWx0ZXIoZGVsdGEudGltZSA9PSAwKSwgYnkgPSBjKCJjZWxsLmlkIiwicmVkIiwiZGVncm9uIiwidHJlYXRtZW50IikpICU+JSAKICBnZ3Bsb3QoLixhZXMoeSA9IGR5LmFsbCwgeCA9IGdmcE1lYW5CZ0FGc3ViLCBjb2xvciA9IGRlZ3JvbikpKwogIGdlb21fcG9pbnQoIGFscGhhID0gMC41KSsKICBmYWNldF9ncmlkKH5yZWQsIHNjYWxlcyA9ICJmcmVlIikrCiAgdGhlbWVfcHVicigpKwogIHNjYWxlX3hfY29udGludW91cygpKwogIHN0YXRfY29yKCkKYGBgCgo=